From 870aca846b95fdf35e26615b534d44c7a77b6196 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:45:41 +0530 Subject: [PATCH 001/126] Create workspace.yaml --- manifest/workspace.yaml | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 manifest/workspace.yaml diff --git a/manifest/workspace.yaml b/manifest/workspace.yaml new file mode 100644 index 0000000..33cadf1 --- /dev/null +++ b/manifest/workspace.yaml @@ -0,0 +1,44 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app: shiksha-workspace + name: shiksha-workspace +spec: + replicas: 1 + selector: + matchLabels: + app: shiksha-workspace + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app: shiksha-workspace + spec: + containers: + - image: ${ECR_REPOSITORY}:${IMAGE_TAG} + imagePullPolicy: "Always" + name: workspace-shiksha + ports: + - containerPort: 3000 + resources: {} + restartPolicy: Always + envFrom: + - configMapRef: + name: workspace-service-config + +status: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: shiksha-workspace +spec: + type: ClusterIP + ports: + - port: 3000 + protocol: TCP + selector: + app: shiksha-workspace From 900c46c388af729c339fdaba39b2d4f9c59c68f0 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:08:48 +0530 Subject: [PATCH 002/126] Create dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 87 +++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .github/workflows/dev-deployment.yaml diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml new file mode 100644 index 0000000..97a2df5 --- /dev/null +++ b/.github/workflows/dev-deployment.yaml @@ -0,0 +1,87 @@ +name: Deploy to EKS-Pratham +on: + workflow_dispatch: +env: + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + EKS_CLUSTER_NAME: ${{ secrets.EKS_CLUSTER_NAME_DEV }} + AWS_REGION: ${{ secrets.AWS_REGION_NAME }} +jobs: + build: + + name: Deployment + runs-on: ubuntu-latest + steps: + - name: Set short git commit SHA + id: commit + uses: prompt/actions-commit-hash@v2 + - name: Check out code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{env.AWS_REGION}} + - name: Setup Node Env + uses: actions/setup-node@v3 + with: + node-version: 21.1.0 + - name: Copy .env file + env: + ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} + run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml + #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml + - name: Show PWD and list content and Latest 3 commits + run: | + echo "Fetching all branches to ensure complete history" + git fetch --all + echo "Checking out the current branch" + git checkout ${{ github.ref_name }} + echo "Git Branch cloned" + git branch + echo "Current 3 merge commits are:" + git log --merges -n 3 + pwd + ls -ltra + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ env.AWS_REGION }} + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + - name: Build, tag, and push image to Amazon ECR + env: + ECR_REGISTRY: ${{ secrets.ECR_REPOSITORY }} + IMAGE_TAG: ${{ secrets.ECR_IMAGE }} + run: | + docker build -t ${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG_DEV }} . + docker push ${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG_DEV }} + - name: Update kube config + run: aws eks update-kubeconfig --name ${{ secrets.EKS_CLUSTER_NAME_DEV }} --region ${{ secrets.AWS_REGION_NAME }} + - name: Deploy to EKS + env: + ECR_REGISTRY: ${{ secrets.ECR_REPOSITORY }} + IMAGE_TAG: ${{ secrets.IMAGE_TAG_DEV }} + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + ECR_IMAGE: ${{ secrets.ECR_IMAGE_DEV }} + run: | + export ECR_REPOSITORY=${{ secrets.ECR_REPOSITORY }} + export IMAGE_TAG=${{ secrets.IMAGE_TAG_DEV }} + export ECR_IMAGE=${{ secrets.ECR_IMAGE_DEV }} + envsubst < manifest/workspace.yaml > manifest/workspace-updated.yaml + cat manifest/workspace-updated.yaml + rm -rf manifest/workspace-service.yaml + kubectl delete deployment workspace + kubectl delete service workspace + kubectl delete cm workspace-service-config + kubectl apply -f manifest/workspace-updated.yaml + kubectl apply -f manifest/configmap.yaml + sleep 10 + kubectl get pods + kubectl get services + kubectl get deployment From 33884693227d64b9068af80339aaf776be2be4aa Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:09:12 +0530 Subject: [PATCH 003/126] Update workspace.yaml --- manifest/workspace.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest/workspace.yaml b/manifest/workspace.yaml index 33cadf1..98ec237 100644 --- a/manifest/workspace.yaml +++ b/manifest/workspace.yaml @@ -21,14 +21,14 @@ spec: - image: ${ECR_REPOSITORY}:${IMAGE_TAG} imagePullPolicy: "Always" name: workspace-shiksha + envFrom: + - configMapRef: + name: workspace-service-config ports: - containerPort: 3000 resources: {} restartPolicy: Always - envFrom: - - configMapRef: - name: workspace-service-config - + status: {} --- apiVersion: v1 From cf8ed51b5248f03080f806ba2011a03516b4f085 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:12:08 +0530 Subject: [PATCH 004/126] Create Dockerfile --- Dockerfile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5b586bd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:20 +WORKDIR /app +COPY . ./ +ENV NEXT_PRIVATE_LOCAL_WEBPACK=true +RUN npm install --legacy-peer-deps +RUN npm run build +EXPOSE 3000 + +CMD ["npm", "run", "start"] From f00ab7e674e69340977ca5056c3bef27f971ce75 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Wed, 23 Oct 2024 17:35:13 +0530 Subject: [PATCH 005/126] Issue #PS-0000 fix: Removed prod deployment file --- .github/workflows/prod-deployment.yaml | 89 -------------------------- 1 file changed, 89 deletions(-) delete mode 100644 .github/workflows/prod-deployment.yaml diff --git a/.github/workflows/prod-deployment.yaml b/.github/workflows/prod-deployment.yaml deleted file mode 100644 index f9d5020..0000000 --- a/.github/workflows/prod-deployment.yaml +++ /dev/null @@ -1,89 +0,0 @@ -name: PROD-WORKSPACE-TAG-BASE-DEPLOYMENT - -on: - push: - tags: - - 'v*' # This will trigger on tags starting with 'v' - -env: - ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} - EKS_CLUSTER_NAME: ${{ secrets.EKS_CLUSTER_NAME_PROD }} - AWS_REGION: ${{ secrets.AWS_REGION_NAME }} - -jobs: - BACKEND-TAG-BASE-DEPLOYMENT-PROD: - name: Deployment - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Set TAG environment variable - run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - - name: Debug TAG value - run: echo "TAG value - ${{ env.TAG }}" - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ env.AWS_REGION }} - - - name: Setup Node Env - uses: actions/setup-node@v3 - with: - node-version: 21.1.0 - - - name: Copy .env file - env: - ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_PROD }} - run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - - - name: Show PWD and list content and Latest 3 commits - run: | - echo "Fetching all branches to ensure complete history" - git fetch --all - echo "Checking out the current branch" - git checkout ${{ github.ref_name }} - echo "Git Branch cloned" - git branch - echo "Current 3 merge commits are:" - git log --merges -n 3 - pwd - ls -ltra - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 - - - name: Build, tag, and push image to Amazon ECR - env: - ECR_REGISTRY: ${{ secrets.ECR_REPOSITORY }} - IMAGE_TAG: ${{ env.TAG }} - run: | - docker build -t ${{ secrets.ECR_REPOSITORY }}:${{ env.TAG }} . - docker push ${{ secrets.ECR_REPOSITORY }}:${{ env.TAG }} - - - name: Update kube config - run: aws eks update-kubeconfig --name ${{ secrets.EKS_CLUSTER_NAME_PROD }} --region ${{ secrets.AWS_REGION_NAME }} - - - name: Deploy to EKS - env: - ECR_REGISTRY: ${{ secrets.ECR_REPOSITORY }} - IMAGE_TAG: ${{ env.TAG }} - run: | - export ECR_REPOSITORY=${{ secrets.ECR_REPOSITORY }} - export IMAGE_TAG=${{ env.TAG }} - envsubst < manifest/backend.yaml > manifest/backend-updated.yaml - cat manifest/backend-updated.yaml - kubectl delete deployment backend - kubectl apply -f manifest/backend-updated.yaml - kubectl apply -f manifest/configmap.yaml - sleep 10 - kubectl get pods - kubectl get services - kubectl get deployment From 8370545e4b3ea0ccbf3faf5102b8346dbce915d9 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 23 Oct 2024 18:26:55 +0530 Subject: [PATCH 006/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 97a2df5..1d5aa51 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -76,8 +76,8 @@ jobs: envsubst < manifest/workspace.yaml > manifest/workspace-updated.yaml cat manifest/workspace-updated.yaml rm -rf manifest/workspace-service.yaml - kubectl delete deployment workspace - kubectl delete service workspace + kubectl delete deployment shiksha-workspace + kubectl delete service shiksha-workspace kubectl delete cm workspace-service-config kubectl apply -f manifest/workspace-updated.yaml kubectl apply -f manifest/configmap.yaml From 196f6313d2b2284b68eb2f9801108d1b5b522889 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Fri, 25 Oct 2024 15:02:22 +0530 Subject: [PATCH 007/126] Issue #PS-0000 fix: Updated deployment file --- .github/workflows/qa-deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qa-deployment.yaml b/.github/workflows/qa-deployment.yaml index e1600ae..baea75b 100644 --- a/.github/workflows/qa-deployment.yaml +++ b/.github/workflows/qa-deployment.yaml @@ -2,7 +2,7 @@ name: Deploy to Tekdi-QA-Server on: push: branches: - - main + - release-1.0.0 jobs: deploy: runs-on: ubuntu-latest From e7f05b7ad5dcd008036aac0ce2b4d4b64d89054c Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Fri, 25 Oct 2024 15:38:35 +0530 Subject: [PATCH 008/126] Issue #PS-0000 fix: Updated sunbirdplayers --- src/pages/sunbirdPlayers.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/sunbirdPlayers.tsx b/src/pages/sunbirdPlayers.tsx index 8348f8d..895a4b8 100644 --- a/src/pages/sunbirdPlayers.tsx +++ b/src/pages/sunbirdPlayers.tsx @@ -36,7 +36,7 @@ interface PlayerProps { const SunbirdPlayers = ({ playerConfig }: PlayerProps) => { console.log("workspace playerconfig", playerConfig); - const mimeType = playerConfig.metadata.mimeType; + const mimeType = playerConfig?.metadata?.mimeType; switch (mimeType) { case "application/pdf": return ; From 5eedffeba2931be2a4c5a888b139785345d5894d Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 25 Oct 2024 15:39:38 +0530 Subject: [PATCH 009/126] Fix build error --- src/components/players/Players.tsx | 2 +- src/pages/sunbirdPlayers.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/players/Players.tsx b/src/components/players/Players.tsx index f974fe8..e2f7ba6 100644 --- a/src/components/players/Players.tsx +++ b/src/components/players/Players.tsx @@ -33,7 +33,7 @@ interface PlayerProps { } const Players = ({ playerConfig }: PlayerProps) => { - const mimeType = playerConfig.metadata.mimeType; + const mimeType = playerConfig?.metadata?.mimeType; switch (mimeType) { case "application/pdf": return ; diff --git a/src/pages/sunbirdPlayers.tsx b/src/pages/sunbirdPlayers.tsx index 8348f8d..895a4b8 100644 --- a/src/pages/sunbirdPlayers.tsx +++ b/src/pages/sunbirdPlayers.tsx @@ -36,7 +36,7 @@ interface PlayerProps { const SunbirdPlayers = ({ playerConfig }: PlayerProps) => { console.log("workspace playerconfig", playerConfig); - const mimeType = playerConfig.metadata.mimeType; + const mimeType = playerConfig?.metadata?.mimeType; switch (mimeType) { case "application/pdf": return ; From af58037b299265101f19e3b2ee2a6d7ff98af7af Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Fri, 25 Oct 2024 15:43:00 +0530 Subject: [PATCH 010/126] Issue #PS-0000 fix: Updated sidebar --- src/components/SideBar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index b282a67..9042d24 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -18,7 +18,7 @@ import CloseIcon from "@mui/icons-material/Close"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; const menuItems = [ - { text: "Create", key: "create" }, + { text: "Create Content", key: "create" }, { text: "All My Contents", key: "allContents" }, { text: "Draft", key: "draft" }, { text: "Submitted for Review", key: "submitted" }, From 5aaaccfff57508bcf71d6aad97f0aa2cf6f1d45a Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 25 Oct 2024 16:17:57 +0530 Subject: [PATCH 011/126] Issue PS-2230 feat: Exposing Review page from workspace --- next.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/next.config.js b/next.config.js index 63e1e37..0eda96a 100644 --- a/next.config.js +++ b/next.config.js @@ -125,6 +125,7 @@ const nextConfig = { "./UploadEditor": "/src/pages/upload-editor.tsx", "./Collection": "/src/pages/collection.tsx", "./SunbirdPlayers": "/src/pages/sunbirdPlayers.tsx", + "./Review": "/src/pages/workspace/content/review/index.tsx", }, }) ); From e5cd0f6b1eb46d668e7ddc037526e93cd71c3c9c Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Fri, 25 Oct 2024 17:45:05 +0530 Subject: [PATCH 012/126] Issue #PS-2281 chore: exposing players from workspace --- src/pages/sunbirdPlayers.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/sunbirdPlayers.tsx b/src/pages/sunbirdPlayers.tsx index 895a4b8..137986b 100644 --- a/src/pages/sunbirdPlayers.tsx +++ b/src/pages/sunbirdPlayers.tsx @@ -29,11 +29,11 @@ const SunbirdQuMLPlayer = dynamic( ); interface PlayerProps { - playerConfig: any; + "player-config": any; identifier: string; } -const SunbirdPlayers = ({ playerConfig }: PlayerProps) => { +const SunbirdPlayers = ({ "player-config": playerConfig }: PlayerProps) => { console.log("workspace playerconfig", playerConfig); const mimeType = playerConfig?.metadata?.mimeType; From 8090f68a8bc9867505aaf3c283a678d5d643e0cd Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Tue, 29 Oct 2024 13:03:51 +0530 Subject: [PATCH 013/126] Issue #PS-2348 feat:Integration of QuML Player in course Planner - changes in workspace --- src/components/players/SunbirdQuMLPlayer.tsx | 94 ++++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/components/players/SunbirdQuMLPlayer.tsx b/src/components/players/SunbirdQuMLPlayer.tsx index ecbd7ae..7173cdd 100644 --- a/src/components/players/SunbirdQuMLPlayer.tsx +++ b/src/components/players/SunbirdQuMLPlayer.tsx @@ -1,65 +1,65 @@ import "reflect-metadata"; import React, { useEffect } from "react"; import { useRef } from "react"; -import $ from 'jquery'; +import $ from "jquery"; interface PlayerConfigProps { - playerConfig: any; + playerConfig: any; } const SunbirdQuMLPlayer = ({ playerConfig }: PlayerConfigProps) => { - const SunbirdQuMLPlayerRef = useRef(null); + const SunbirdQuMLPlayerRef = useRef(null); - useEffect(() => { - if (typeof window !== 'undefined') { - window.$ = window.jQuery = $; - window.questionListUrl = "/action/question/v2/list"; - } + useEffect(() => { + if (typeof window !== "undefined") { + window.$ = window.jQuery = $; + window.questionListUrl = "/api/question/v2/list"; + } - const script = document.createElement("script"); - script.src = - "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-quml-player-web-component@3.0.0/sunbird-quml-player.js"; - script.async = true; - document.body.appendChild(script); + const script = document.createElement("script"); + script.src = + "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-quml-player-web-component@3.0.0/sunbird-quml-player.js"; + script.async = true; + document.body.appendChild(script); - const link = document.createElement("link"); - link.rel = "stylesheet"; - link.href = - "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-quml-player-web-component@3.0.0/styles.css"; - document.head.appendChild(link); + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = + "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-quml-player-web-component@3.0.0/styles.css"; + document.head.appendChild(link); - const playerElement = SunbirdQuMLPlayerRef.current; + const playerElement = SunbirdQuMLPlayerRef.current; - const handlePlayerEvent = (event: any) => { - console.log("Player Event", event.detail); - }; - const handleTelemetryEvent = (event: any) => { - console.log("Telemetry Event", event.detail); - }; + const handlePlayerEvent = (event: any) => { + console.log("Player Event", event.detail); + }; + const handleTelemetryEvent = (event: any) => { + console.log("Telemetry Event", event.detail); + }; - // Ensure the script has loaded before adding event listeners - script.onload = () => { - playerElement?.addEventListener("playerEvent", handlePlayerEvent); - playerElement?.addEventListener("telemetryEvent", handleTelemetryEvent); - }; + // Ensure the script has loaded before adding event listeners + script.onload = () => { + playerElement?.addEventListener("playerEvent", handlePlayerEvent); + playerElement?.addEventListener("telemetryEvent", handleTelemetryEvent); + }; - return () => { - playerElement?.removeEventListener("playerEvent", handlePlayerEvent); - playerElement?.removeEventListener( - "telemetryEvent", - handleTelemetryEvent - ); - document.body.removeChild(script); - }; - }, []); + return () => { + playerElement?.removeEventListener("playerEvent", handlePlayerEvent); + playerElement?.removeEventListener( + "telemetryEvent", + handleTelemetryEvent + ); + document.body.removeChild(script); + }; + }, []); - return ( -
- -
- ); + return ( +
+ +
+ ); }; export default SunbirdQuMLPlayer; From bcd5efbe2749b8b674cdb017b197bc62404b33cf Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Wed, 30 Oct 2024 12:32:42 +0530 Subject: [PATCH 014/126] Issue #PS-2347 feat: event handling on players --- src/components/CourseCard.tsx | 1 + src/components/players/PlayerConfig.js | 4 ++-- src/components/players/SunbirdEpubPlayer.tsx | 8 ++++++++ src/components/players/SunbirdPdfPlayer.tsx | 10 ++++++++++ src/components/players/SunbirdQuMLPlayer.tsx | 8 ++++++++ src/components/players/SunbirdVideoPlayer.tsx | 9 +++++++++ 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/components/CourseCard.tsx b/src/components/CourseCard.tsx index 86a7a6b..aba303b 100644 --- a/src/components/CourseCard.tsx +++ b/src/components/CourseCard.tsx @@ -50,6 +50,7 @@ const CourseCard: React.FC = ({ MIME_TYPE.GENERIC_MIME_TYPE.includes(mimeType) && mode === "review" ) { + sessionStorage.setItem("previousPage", window.location.href); router.push({ pathname: `/workspace/content/review`, query: { identifier, mode }, diff --git a/src/components/players/PlayerConfig.js b/src/components/players/PlayerConfig.js index 8ff2090..e652723 100644 --- a/src/components/players/PlayerConfig.js +++ b/src/components/players/PlayerConfig.js @@ -41,10 +41,10 @@ export const playerConfig = { { id: "org.sunbird.player.endpage", ver: 1.1, type: "plugin" }, ], sideMenu: { - showShare: true, + showShare: false, showDownload: true, showExit: true, - showPrint: true, + showPrint: false, showReplay: true, }, }, diff --git a/src/components/players/SunbirdEpubPlayer.tsx b/src/components/players/SunbirdEpubPlayer.tsx index 80a1894..ce29603 100644 --- a/src/components/players/SunbirdEpubPlayer.tsx +++ b/src/components/players/SunbirdEpubPlayer.tsx @@ -27,6 +27,14 @@ const SunbirdEpubPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); + if (event?.detail?.type === "EXIT") { + const previousPage = sessionStorage.getItem("previousPage"); + if (previousPage) { + window.location.href = previousPage; + } else { + window.history.go(-1); + } + } }; const handleTelemetryEvent = (event: any) => { console.log("Telemetry Event", event.detail); diff --git a/src/components/players/SunbirdPdfPlayer.tsx b/src/components/players/SunbirdPdfPlayer.tsx index 38cb4dc..c40680e 100644 --- a/src/components/players/SunbirdPdfPlayer.tsx +++ b/src/components/players/SunbirdPdfPlayer.tsx @@ -27,6 +27,16 @@ const SunbirdPdfPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); + if (event?.detail?.edata?.type === "EXIT") { + const previousPage = sessionStorage.getItem("previousPage"); + if (previousPage) { + window.location.href = previousPage; + console.log("exited prev page"); + } else { + window.history.go(-1); + console.log("exited history"); + } + } }; const handleTelemetryEvent = (event: any) => { console.log("Telemetry Event", event.detail); diff --git a/src/components/players/SunbirdQuMLPlayer.tsx b/src/components/players/SunbirdQuMLPlayer.tsx index 7173cdd..5cb4de9 100644 --- a/src/components/players/SunbirdQuMLPlayer.tsx +++ b/src/components/players/SunbirdQuMLPlayer.tsx @@ -31,6 +31,14 @@ const SunbirdQuMLPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); + if (event?.detail?.edata?.type === "EXIT") { + const previousPage = sessionStorage.getItem("previousPage"); + if (previousPage) { + window.location.href = previousPage; + } else { + window.history.go(-1); + } + } }; const handleTelemetryEvent = (event: any) => { console.log("Telemetry Event", event.detail); diff --git a/src/components/players/SunbirdVideoPlayer.tsx b/src/components/players/SunbirdVideoPlayer.tsx index d856265..b4b15ef 100644 --- a/src/components/players/SunbirdVideoPlayer.tsx +++ b/src/components/players/SunbirdVideoPlayer.tsx @@ -26,7 +26,16 @@ const SunbirdVideoPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); + if (event?.detail?.type === "EXIT") { + const previousPage = sessionStorage.getItem("previousPage"); + if (previousPage) { + window.location.href = previousPage; + } else { + window.history.go(-1); + } + } }; + const handleTelemetryEvent = (event: any) => { console.log("Telemetry Event", event.detail); }; From a30e0d60d041d41cb008f837e834c9471bf20643 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:35:29 +0530 Subject: [PATCH 015/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 1d5aa51..3dd6f02 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -6,8 +6,7 @@ env: EKS_CLUSTER_NAME: ${{ secrets.EKS_CLUSTER_NAME_DEV }} AWS_REGION: ${{ secrets.AWS_REGION_NAME }} jobs: - build: - + build_dev: name: Deployment runs-on: ubuntu-latest steps: From 37519192066401819374583b73a619e9d71f7d9e Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Wed, 30 Oct 2024 12:46:28 +0530 Subject: [PATCH 016/126] Issue #PS-2347 feat: event handling on players --- src/components/players/SunbirdEpubPlayer.tsx | 8 ++------ src/components/players/SunbirdPdfPlayer.tsx | 10 ++-------- src/components/players/SunbirdQuMLPlayer.tsx | 8 ++------ src/components/players/SunbirdVideoPlayer.tsx | 8 ++------ src/utils/Helper.ts | 9 +++++++++ 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/components/players/SunbirdEpubPlayer.tsx b/src/components/players/SunbirdEpubPlayer.tsx index ce29603..7447a78 100644 --- a/src/components/players/SunbirdEpubPlayer.tsx +++ b/src/components/players/SunbirdEpubPlayer.tsx @@ -1,6 +1,7 @@ import "reflect-metadata"; import React, { useEffect } from "react"; import { useRef } from "react"; +import { handleExitEvent } from "@/utils/Helper"; interface PlayerConfigProps { playerConfig: any; @@ -28,12 +29,7 @@ const SunbirdEpubPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); if (event?.detail?.type === "EXIT") { - const previousPage = sessionStorage.getItem("previousPage"); - if (previousPage) { - window.location.href = previousPage; - } else { - window.history.go(-1); - } + handleExitEvent(); } }; const handleTelemetryEvent = (event: any) => { diff --git a/src/components/players/SunbirdPdfPlayer.tsx b/src/components/players/SunbirdPdfPlayer.tsx index c40680e..3d28303 100644 --- a/src/components/players/SunbirdPdfPlayer.tsx +++ b/src/components/players/SunbirdPdfPlayer.tsx @@ -1,6 +1,7 @@ import "reflect-metadata"; import React, { useEffect } from "react"; import { useRef } from "react"; +import { handleExitEvent } from "@/utils/Helper"; interface PlayerConfigProps { playerConfig: any; @@ -28,14 +29,7 @@ const SunbirdPdfPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); if (event?.detail?.edata?.type === "EXIT") { - const previousPage = sessionStorage.getItem("previousPage"); - if (previousPage) { - window.location.href = previousPage; - console.log("exited prev page"); - } else { - window.history.go(-1); - console.log("exited history"); - } + handleExitEvent(); } }; const handleTelemetryEvent = (event: any) => { diff --git a/src/components/players/SunbirdQuMLPlayer.tsx b/src/components/players/SunbirdQuMLPlayer.tsx index 5cb4de9..e93cad3 100644 --- a/src/components/players/SunbirdQuMLPlayer.tsx +++ b/src/components/players/SunbirdQuMLPlayer.tsx @@ -2,6 +2,7 @@ import "reflect-metadata"; import React, { useEffect } from "react"; import { useRef } from "react"; import $ from "jquery"; +import { handleExitEvent } from "@/utils/Helper"; interface PlayerConfigProps { playerConfig: any; } @@ -32,12 +33,7 @@ const SunbirdQuMLPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); if (event?.detail?.edata?.type === "EXIT") { - const previousPage = sessionStorage.getItem("previousPage"); - if (previousPage) { - window.location.href = previousPage; - } else { - window.history.go(-1); - } + handleExitEvent(); } }; const handleTelemetryEvent = (event: any) => { diff --git a/src/components/players/SunbirdVideoPlayer.tsx b/src/components/players/SunbirdVideoPlayer.tsx index b4b15ef..618e155 100644 --- a/src/components/players/SunbirdVideoPlayer.tsx +++ b/src/components/players/SunbirdVideoPlayer.tsx @@ -1,3 +1,4 @@ +import { handleExitEvent } from "@/utils/Helper"; import { Height } from "@mui/icons-material"; import React, { useEffect, useRef } from "react"; @@ -27,12 +28,7 @@ const SunbirdVideoPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); if (event?.detail?.type === "EXIT") { - const previousPage = sessionStorage.getItem("previousPage"); - if (previousPage) { - window.location.href = previousPage; - } else { - window.history.go(-1); - } + handleExitEvent(); } }; diff --git a/src/utils/Helper.ts b/src/utils/Helper.ts index 0027337..fd6a8a2 100644 --- a/src/utils/Helper.ts +++ b/src/utils/Helper.ts @@ -39,3 +39,12 @@ export const debounce = any>( }, wait); }; }; + +export const handleExitEvent = () => { + const previousPage = sessionStorage.getItem("previousPage"); + if (previousPage) { + window.location.href = previousPage; + } else { + window.history.go(-1); + } +}; From ddb777c402f55d7396bfd68152295815bf87d298 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 1 Nov 2024 16:19:23 +0530 Subject: [PATCH 017/126] Issue #PS-2339 feat: Integration of V1 Content Player in Workspace --- src/components/V1-Player/V1Player.tsx | 50 ++++++++++++ src/components/players/PlayerConfig.js | 80 ++++++++++++++++++++ src/pages/workspace/content/review/index.tsx | 22 ++++-- 3 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 src/components/V1-Player/V1Player.tsx diff --git a/src/components/V1-Player/V1Player.tsx b/src/components/V1-Player/V1Player.tsx new file mode 100644 index 0000000..1713828 --- /dev/null +++ b/src/components/V1-Player/V1Player.tsx @@ -0,0 +1,50 @@ +import React, { useRef, useEffect } from 'react'; + +interface PlayerProps { + playerConfig: any; +} + +const V1Player = ({ playerConfig }: PlayerProps) => { + const previewRef = useRef(null); + + useEffect(() => { + const preview: any = previewRef.current; + if (preview) { + const originalSrc = preview.src; + preview.src = ''; + preview.src = originalSrc; + + const handleLoad = () => { + setTimeout(() => { + if (preview.contentWindow && preview.contentWindow.initializePreview) { + preview.contentWindow.initializePreview(playerConfig); + } + preview.contentWindow.addEventListener('message', (event: any) => { + console.log('V1 player event', event); + }); + }, 100); + }; + + preview.addEventListener('load', handleLoad); + + return () => { + preview.removeEventListener('load', handleLoad); + }; + } + }, [playerConfig]); + + return ( +
+ +
+ ); +}; + +export default V1Player; diff --git a/src/components/players/PlayerConfig.js b/src/components/players/PlayerConfig.js index 8ff2090..1fc8e5c 100644 --- a/src/components/players/PlayerConfig.js +++ b/src/components/players/PlayerConfig.js @@ -51,3 +51,83 @@ export const playerConfig = { metadata: {}, data: {}, }; + +export const V1PlayerConfig = { + config: { + whiteListUrl: [], + showEndPage: false, + endPage: [ + { + template: "assessment", + contentType: ["SelfAssess"], + }, + ], + showStartPage: true, + host: "", + overlay: { + enableUserSwitcher: true, + showOverlay: true, + showNext: true, + showPrevious: true, + showSubmit: false, + showReload: false, + showUser: false, + menu: { + showTeachersInstruction: false, + }, + }, + splash: { + text: "", + icon: "", + bgImage: "assets/icons/splacebackground_1.png", + webLink: "", + }, + apislug: "/action", + repos: ["/sunbird-plugins/renderer"], + plugins: [ + { + id: "org.sunbird.iframeEvent", + ver: 1, + type: "plugin", + }, + { + id: "org.sunbird.player.endpage", + ver: 1.1, + type: "plugin", + }, + ], + sideMenu: { + showShare: true, + showDownload: true, + showExit: false, + }, + enableTelemetryValidation: false, + }, + context: { + mode: "play", + partner: [], + pdata: { + id: "pratham.admin.portal", + ver: "1.0.0", + pid: "admin-portal", + }, + contentId: "do_12345", + sid: "", + uid: "", + timeDiff: -1.129, + contextRollup: { + }, + channel: "test-k12-channel", + did: "", + dims: [], + tags: ["test-k12-channel"], + app: ["test-k12-channel"], + cdata: [], + userData: { + firstName: "Guest", + lastName: "User", + }, + }, + data: {}, + metadata: {} +}; diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 36c2ab1..6acdeb4 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -16,7 +16,8 @@ import ConfirmActionPopup from "../../../../components/ConfirmActionPopup"; import ReviewCommentPopup from "../../../../components/ReviewCommentPopup"; import { publishContent, submitComment } from "@/services/ContentService"; import Players from "@/components/players/Players"; -import { playerConfig } from "../../../../components/players/PlayerConfig"; +import V1Player from "@/components/V1-Player/V1Player"; +import { playerConfig, V1PlayerConfig } from "../../../../components/players/PlayerConfig"; import { pdfMetadata, videoMetadata, @@ -26,9 +27,10 @@ import { import $ from "jquery"; const ReviewContentSubmissions = () => { + const interactiveMimeTypes = ["application/vnd.ekstep.h5p-archive", "application/vnd.ekstep.html-archive"]; + const [isContentInteractiveType, setIsContentInteractiveType] = useState(false); const router = useRouter(); const { identifier } = router.query; - // const identifier = "do_2141610327664312321258"; const [contentDetails, setContentDetails] = useState(undefined); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); @@ -51,8 +53,14 @@ const ReviewContentSubmissions = () => { // playerConfig.metadata = quMLMetadata; // playerConfig.metadata = epubMetadata; console.log("data ==>", data); - playerConfig.metadata = data; - console.log('playerConfig ==>', playerConfig); + if (interactiveMimeTypes.includes(data?.mimeType)) { + V1PlayerConfig.metadata = data; + V1PlayerConfig.context.contentId = data.identifier + setIsContentInteractiveType(true); + } else { + setIsContentInteractiveType(false); + playerConfig.metadata = data; + } setContentDetails(data); } } catch (error) { @@ -193,7 +201,11 @@ const ReviewContentSubmissions = () => { }} >
- + {isContentInteractiveType ? ( + + ) : ( + + )}
From cf3cb85e870f50a281bcf5626da13a98c004af7d Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Mon, 4 Nov 2024 17:54:14 +0530 Subject: [PATCH 018/126] Issue #PS-2339 feat: Integration of V1 Content Player in Workspace --- src/components/V1-Player/V1Player.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/V1-Player/V1Player.tsx b/src/components/V1-Player/V1Player.tsx index 1713828..03a8758 100644 --- a/src/components/V1-Player/V1Player.tsx +++ b/src/components/V1-Player/V1Player.tsx @@ -19,7 +19,7 @@ const V1Player = ({ playerConfig }: PlayerProps) => { if (preview.contentWindow && preview.contentWindow.initializePreview) { preview.contentWindow.initializePreview(playerConfig); } - preview.contentWindow.addEventListener('message', (event: any) => { + preview.contentWindow.addEventListener('message', (event: any) => { // NOSONAR console.log('V1 player event', event); }); }, 100); From bce2af0014aa89f54b9caf3beb189082b2b1a95a Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Tue, 5 Nov 2024 10:46:55 +0530 Subject: [PATCH 019/126] Issue #PS-2339 feat: Integration of V1 Content Player in Workspace --- src/pages/workspace/content/review/index.tsx | 4 ++-- src/utils/app.config.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 6acdeb4..11e995d 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -25,9 +25,9 @@ import { epubMetadata, } from "../../../../components/players/playerMetadata"; import $ from "jquery"; +import { MIME_TYPE } from "@/utils/app.config"; const ReviewContentSubmissions = () => { - const interactiveMimeTypes = ["application/vnd.ekstep.h5p-archive", "application/vnd.ekstep.html-archive"]; const [isContentInteractiveType, setIsContentInteractiveType] = useState(false); const router = useRouter(); const { identifier } = router.query; @@ -53,7 +53,7 @@ const ReviewContentSubmissions = () => { // playerConfig.metadata = quMLMetadata; // playerConfig.metadata = epubMetadata; console.log("data ==>", data); - if (interactiveMimeTypes.includes(data?.mimeType)) { + if (MIME_TYPE.INTERACTIVE_MIME_TYPE.includes(data?.mimeType)) { V1PlayerConfig.metadata = data; V1PlayerConfig.context.contentId = data.identifier setIsContentInteractiveType(true); diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index 1c77764..e203f3a 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -14,4 +14,5 @@ export const MIME_TYPE = { ], QUESTIONSET_MIME_TYPE: "application/vnd.sunbird.questionset", COURSE_MIME_TYPE: "application/vnd.ekstep.content-collection", + INTERACTIVE_MIME_TYPE: ["application/vnd.ekstep.h5p-archive", "application/vnd.ekstep.html-archive"] }; From 7d0d0cc2b888da887be1bda9a380951fdfdd885d Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Tue, 5 Nov 2024 17:20:37 +0530 Subject: [PATCH 020/126] Issue #PS-2324 feat: filter and sortby functionality in workspace --- next.config.js | 4 + src/components/SearchBox.tsx | 94 ++++++++++++++++++- .../workspace/content/allContents/index.tsx | 27 +++++- src/pages/workspace/content/draft/index.tsx | 19 ++-- src/pages/workspace/content/publish/index.tsx | 24 +++-- src/pages/workspace/content/review/index.tsx | 12 ++- .../workspace/content/submitted/index.tsx | 19 ++-- src/services/ContentService.ts | 89 +++++++++++++----- src/utils/app.constant.ts | 3 + 9 files changed, 235 insertions(+), 56 deletions(-) diff --git a/next.config.js b/next.config.js index 0eda96a..6ea2ad9 100644 --- a/next.config.js +++ b/next.config.js @@ -31,6 +31,10 @@ const nextConfig = { source: "/action/asset/v1/upload/:identifier*", // Match asset upload routes destination: "/api/fileUpload", // Forward asset uploads to fileUpload.js }, + { + source: "/assets/pdfjs/:path*", // Match any URL starting with /workspace/content/assets/ + destination: "/assets/:path*", // Serve the assets from the public folder + }, { source: "/action/content/v3/upload/url/:identifier*", // Match content upload with 'url' in the path destination: diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index 1cf4c62..ad2c89e 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -1,30 +1,69 @@ -import React, { useCallback, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { Box, + Checkbox, + FormControl, Grid, IconButton, InputBase, + InputLabel, + ListItemText, + MenuItem, + OutlinedInput, Paper, + Select, useTheme, + SelectChangeEvent, } from "@mui/material"; import SearchIcon from "@mui/icons-material/Search"; import ClearIcon from "@mui/icons-material/Clear"; import { debounce } from "@/utils/Helper"; +import { getPrimaryCategory } from "@/services/ContentService"; +import { SortOptions } from "@/utils/app.constant"; export interface SearchBarProps { onSearch: (value: string) => void; value?: string; onClear?: () => void; placeholder: string; + onFilterChange?: (selectedFilters: string[]) => void; + onSortChange?: (sortBy: string) => void; } +const sortOptions = SortOptions; + const SearchBox: React.FC = ({ onSearch, value = "", placeholder = "Search...", + onFilterChange, + onSortChange, }) => { const theme = useTheme(); const [searchTerm, setSearchTerm] = useState(value); + const [selectedFilters, setSelectedFilters] = useState([]); + const [sortBy, setSortBy] = useState(""); + const [primaryCategory, setPrimaryCategory] = useState(); + + useEffect(() => { + const PrimaryCategoryData = async () => { + const response = await getPrimaryCategory(); + const collectionPrimaryCategories = + response?.channel?.collectionPrimaryCategories; + const contentPrimaryCategories = + response?.channel?.contentPrimaryCategories; + + const PrimaryCategory = [ + ...collectionPrimaryCategories, + ...contentPrimaryCategories, + ]; + setPrimaryCategory(PrimaryCategory); + localStorage.setItem("PrimaryCategory", JSON.stringify(PrimaryCategory)); + }; + PrimaryCategoryData(); + }, []); + + const filterOptions = primaryCategory; const handleSearchClear = () => { onSearch(""); @@ -44,9 +83,21 @@ const SearchBox: React.FC = ({ handleSearch(searchTerm); }; + const handleFilterChange = (event: SelectChangeEvent) => { + const value = event.target.value as string[]; + setSelectedFilters(value); + onFilterChange && onFilterChange(value); + }; + + const handleSortChange = (event: SelectChangeEvent) => { + const value = event.target.value as string; + setSortBy(value); + onSortChange && onSortChange(value); + }; + return ( - - + + = ({ + + + + Filter By + + + + + + + Sort By + + + ); }; diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index b71cb76..34df271 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -31,7 +31,7 @@ const AllContentsPage = () => { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const [searchTerm, setSearchTerm] = useState(""); - const [filter, setFilter] = useState("all"); + const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("updated"); const [contentList, setContentList] = React.useState([]); const [loading, setLoading] = useState(false); @@ -65,7 +65,7 @@ const AllContentsPage = () => { setSearchTerm(term); }; - const handleFilterChange = (filter: string) => { + const handleFilterChange = (filter: string[]) => { setFilter(filter); }; @@ -100,8 +100,20 @@ const AllContentsPage = () => { "FlagReview", ]; const query = debouncedSearchTerm || ""; + const primaryCategory = filter.length ? filter : []; + const order = sortBy === "Modified On" ? "desc" : "asc"; + const sort_by = { + lastUpdatedOn: order, + }; const offset = page * LIMIT; - const response = await getContent(status, query, LIMIT, offset); + const response = await getContent( + status, + query, + LIMIT, + offset, + primaryCategory, + sort_by + ); const contentList = (response?.content || []).concat( response?.QuestionSet || [] ); @@ -113,7 +125,7 @@ const AllContentsPage = () => { } }; getContentList(); - }, [debouncedSearchTerm, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); const handleDeleteClick = async (content: any) => { if (content?.identifier && content?.mimeType) { @@ -149,7 +161,12 @@ const AllContentsPage = () => { Here you see all your content. - + {loading ? ( diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 14e87a4..76d69c6 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -14,7 +14,7 @@ const DraftPage = () => { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(4); const [searchTerm, setSearchTerm] = useState(""); - const [filter, setFilter] = useState("all"); + const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("updated"); const [contentList, setContentList] = React.useState([]); const [contentDeleted, setContentDeleted] = React.useState(false); @@ -48,7 +48,7 @@ const DraftPage = () => { setSearchTerm(search.toLowerCase()); }; - const handleFilterChange = (filter: string) => { + const handleFilterChange = (filter: string[]) => { setFilter(filter); }; @@ -82,11 +82,18 @@ const DraftPage = () => { setLoading(true); const query = debouncedSearchTerm || ""; const offset = page * LIMIT; + const primaryCategory = filter.length ? filter : []; + const order = sortBy === "Modified On" ? "desc" : "asc"; + const sort_by = { + lastUpdatedOn: order, + }; const response = await getContent( ["Draft", "FlagDraft"], query, LIMIT, - offset + offset, + primaryCategory, + sort_by ); const contentList = (response?.content || []).concat( response?.QuestionSet || [] @@ -99,7 +106,7 @@ const DraftPage = () => { } }; getDraftContentList(); - }, [debouncedSearchTerm, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); return ( @@ -111,8 +118,8 @@ const DraftPage = () => { diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 4d5e26c..d3a2f45 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -12,7 +12,7 @@ import { LIMIT } from "@/utils/app.constant"; const PublishPage = () => { const [selectedKey, setSelectedKey] = useState("publish"); const [searchTerm, setSearchTerm] = useState(""); - const [filter, setFilter] = useState("all"); + const [filter, setFilter] = useState(); const [sortBy, setSortBy] = useState("updated"); const [contentList, setContentList] = React.useState([]); const [loading, setLoading] = useState(false); @@ -40,7 +40,7 @@ const PublishPage = () => { setSearchTerm(search.toLowerCase()); }; - const handleFilterChange = (filter: string) => { + const handleFilterChange = (filter: string[]) => { setFilter(filter); }; @@ -75,7 +75,19 @@ const PublishPage = () => { setLoading(true); const query = debouncedSearchTerm || ""; const offset = page * LIMIT; - const response = await getContent(["Live"], query, LIMIT, offset); + const primaryCategory = filter?.length ? filter : []; + const order = sortBy === "Modified On" ? "desc" : "asc"; + const sort_by = { + lastUpdatedOn: order, + }; + const response = await getContent( + ["Live"], + query, + LIMIT, + offset, + primaryCategory, + sort_by + ); const contentList = (response?.content || []).concat( response?.QuestionSet || [] ); @@ -87,7 +99,7 @@ const PublishPage = () => { } }; getPublishContentList(); - }, [debouncedSearchTerm, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); return ( @@ -99,8 +111,8 @@ const PublishPage = () => { diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 11e995d..e294837 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -17,7 +17,10 @@ import ReviewCommentPopup from "../../../../components/ReviewCommentPopup"; import { publishContent, submitComment } from "@/services/ContentService"; import Players from "@/components/players/Players"; import V1Player from "@/components/V1-Player/V1Player"; -import { playerConfig, V1PlayerConfig } from "../../../../components/players/PlayerConfig"; +import { + playerConfig, + V1PlayerConfig, +} from "../../../../components/players/PlayerConfig"; import { pdfMetadata, videoMetadata, @@ -28,7 +31,8 @@ import $ from "jquery"; import { MIME_TYPE } from "@/utils/app.config"; const ReviewContentSubmissions = () => { - const [isContentInteractiveType, setIsContentInteractiveType] = useState(false); + const [isContentInteractiveType, setIsContentInteractiveType] = + useState(false); const router = useRouter(); const { identifier } = router.query; @@ -55,7 +59,7 @@ const ReviewContentSubmissions = () => { console.log("data ==>", data); if (MIME_TYPE.INTERACTIVE_MIME_TYPE.includes(data?.mimeType)) { V1PlayerConfig.metadata = data; - V1PlayerConfig.context.contentId = data.identifier + V1PlayerConfig.context.contentId = data.identifier; setIsContentInteractiveType(true); } else { setIsContentInteractiveType(false); @@ -201,7 +205,7 @@ const ReviewContentSubmissions = () => { }} >
- {isContentInteractiveType ? ( + {isContentInteractiveType ? ( ) : ( diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 64e340d..9dd805b 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -12,7 +12,7 @@ import { LIMIT } from "@/utils/app.constant"; const SubmittedForReviewPage = () => { const [selectedKey, setSelectedKey] = useState("submitted"); - const [filter, setFilter] = useState("all"); + const [filter, setFilter] = useState(); const [sortBy, setSortBy] = useState("updated"); const [searchTerm, setSearchTerm] = useState(""); const [contentList, setContentList] = React.useState([]); @@ -40,7 +40,7 @@ const SubmittedForReviewPage = () => { setSearchTerm(search.toLowerCase()); }; - const handleFilterChange = (filter: string) => { + const handleFilterChange = (filter: string[]) => { setFilter(filter); }; @@ -75,11 +75,18 @@ const SubmittedForReviewPage = () => { setLoading(true); const query = debouncedSearchTerm || ""; const offset = page * LIMIT; + const primaryCategory = filter?.length ? filter : []; + const order = sortBy === "Modified On" ? "desc" : "asc"; + const sort_by = { + lastUpdatedOn: order, + }; const response = await getContent( ["Review", "FlagReview"], query, LIMIT, - offset + offset, + primaryCategory, + sort_by ); const contentList = (response?.content || []).concat( response?.QuestionSet || [] @@ -92,7 +99,7 @@ const SubmittedForReviewPage = () => { } }; getReviewContentList(); - }, [debouncedSearchTerm, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); return ( @@ -106,8 +113,8 @@ const SubmittedForReviewPage = () => { diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index b5ce76f..6470064 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -1,34 +1,44 @@ import { stringify } from "json5"; import { getLocalStoredUserData } from "./LocalStorageService"; -import { delApi, deleteApi, post } from "./RestClient"; +import { delApi, get, post } from "./RestClient"; import axios from "axios"; import { MIME_TYPE } from "@/utils/app.config"; const authToken = process.env.NEXT_PUBLIC_AUTH_API_TOKEN; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; import { v4 as uuidv4 } from "uuid"; +import { ChannelID } from "@/utils/app.constant"; const userId = getLocalStoredUserData(); console.log("userId ==>", userId); +export const getPrimaryCategory = async () => { + const apiURL = `/api/channel/v1/read/${ChannelID}`; + try { + const response = await get(apiURL); + return response?.data?.result; + } catch (error) { + throw error; + } +}; + +// const PrimaryCategoryData = async () => { +// const response = await getPrimaryCategory(); +// const collectionPrimaryCategories = +// response?.channel?.collectionPrimaryCategories; +// const contentPrimaryCategories = response?.channel?.contentPrimaryCategories; + +// const PrimaryCategory = [ +// ...collectionPrimaryCategories, +// ...contentPrimaryCategories, +// ]; +// return PrimaryCategory; +// }; + const defaultReqBody = { request: { filters: { createdBy: userId, - primaryCategory: [ - "Course Assessment", - "eTextbook", - "Explanation Content", - "Learning Resource", - "Practice Question Set", - "Teacher Resource", - "Exam Question", - "Content Playlist", - "Course", - "Digital Textbook", - "Question paper", - ], }, - // query: "", sort_by: { lastUpdatedOn: "desc", }, @@ -39,8 +49,18 @@ const getReqBodyWithStatus = ( status: string[], query: string, limit: number, - offset: number + offset: number, + primaryCategory: any, + sort_by: any ) => { + if (typeof window !== "undefined" && typeof localStorage !== "undefined") { + var PrimaryCategory = JSON.parse( + localStorage.getItem("PrimaryCategory") || "" + ); + } + primaryCategory = + primaryCategory.length === 0 ? PrimaryCategory : primaryCategory; + return { ...defaultReqBody, request: { @@ -48,10 +68,12 @@ const getReqBodyWithStatus = ( filters: { ...defaultReqBody.request.filters, status, + primaryCategory, }, query, limit, offset, + sort_by, }, }; }; @@ -60,11 +82,20 @@ export const getContent = async ( status: string[], query: string, limit: number, - offset: number + offset: number, + primaryCategory: string[], + sort_by: any ) => { const apiURL = "/action/composite/v3/search"; try { - const reqBody = getReqBodyWithStatus(status, query, limit, offset); + const reqBody = getReqBodyWithStatus( + status, + query, + limit, + offset, + primaryCategory, + sort_by + ); const response = await post(apiURL, reqBody); return response?.data?.result; } catch (error) { @@ -152,13 +183,16 @@ export const publishContent = async (identifier: any) => { const requestBody = { request: { content: { - lastPublishedBy: userId - } - } + lastPublishedBy: userId, + }, + }, }; try { - const response = await axios.post(`/action/content/v3/publish/${identifier}`, requestBody); + const response = await axios.post( + `/action/content/v3/publish/${identifier}`, + requestBody + ); return response.data; } catch (error) { console.error("Error during publishing:", error); @@ -170,13 +204,16 @@ export const submitComment = async (identifier: any, comment: any) => { const requestBody = { request: { content: { - rejectComment: comment - } - } + rejectComment: comment, + }, + }, }; try { - const response = await axios.post(`/action/content/v3/reject/${identifier}`, requestBody); + const response = await axios.post( + `/action/content/v3/reject/${identifier}`, + requestBody + ); return response.data; } catch (error) { console.error("Error submitting comment:", error); diff --git a/src/utils/app.constant.ts b/src/utils/app.constant.ts index 4eed0f3..04971a7 100644 --- a/src/utils/app.constant.ts +++ b/src/utils/app.constant.ts @@ -8,4 +8,7 @@ export enum ContentType { QUESTION_SET = "QuestionSet", } +export const SortOptions = ["Modified On", "Created On"]; + export const LIMIT = 6; +export const ChannelID = "test-k12-channel"; From cc96a57d3314540e679d282566bed527ab43de90 Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Wed, 6 Nov 2024 12:33:29 +0530 Subject: [PATCH 021/126] Issue #2241 feat: Course Editor implementation in Workspace App --- src/components/CollectionEditor.tsx | 18 ++++++++++++++++++ src/services/ContentService.ts | 28 +++++++++++++++++----------- src/utils/app.config.ts | 4 ++++ 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 22828e2..a535e92 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -190,6 +190,24 @@ const CollectionEditor: React.FC = () => { "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-pdf-player-web-component@1.4.0/styles.css"; document.head.appendChild(pdfLink); } + + if (!document.getElementById("sunbird-video-player.js")) { + const videoScript = document.createElement("script"); + videoScript.id = "sunbird-video-player.js"; + videoScript.src = + "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-video-player-web-component@1.2.5/sunbird-video-player.js"; + videoScript.async = true; + document.body.appendChild(videoScript); + } + + if (!document.getElementById("sunbird-video-player-css")) { + const videoLink = document.createElement("link"); + videoLink.id = "sunbird-video-player-css"; + videoLink.rel = "stylesheet"; + videoLink.href = + "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-video-player-web-component@1.2.5/styles.css"; + document.head.appendChild(videoLink); + } }; loadAssets(); diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index b5ce76f..44c0511 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -2,7 +2,7 @@ import { stringify } from "json5"; import { getLocalStoredUserData } from "./LocalStorageService"; import { delApi, deleteApi, post } from "./RestClient"; import axios from "axios"; -import { MIME_TYPE } from "@/utils/app.config"; +import { MIME_TYPE, TENANTID } from "@/utils/app.config"; const authToken = process.env.NEXT_PUBLIC_AUTH_API_TOKEN; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; import { v4 as uuidv4 } from "uuid"; @@ -80,7 +80,7 @@ export const createQuestionSet = async () => { name: "Untitled QuestionSet", mimeType: "application/vnd.sunbird.questionset", primaryCategory: "Practice Question Set", - code: "de1508e3-cd30-48ba-b4de-25a98d8cfdd2", + code: uuidv4(), createdBy: userId, }, }, @@ -90,7 +90,7 @@ export const createQuestionSet = async () => { const response = await axios.post(apiURL, reqBody, { headers: { "Content-Type": "application/json", - tenantId: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", + tenantId: TENANTID.ID, }, }); return response?.data; @@ -152,13 +152,16 @@ export const publishContent = async (identifier: any) => { const requestBody = { request: { content: { - lastPublishedBy: userId - } - } + lastPublishedBy: userId, + }, + }, }; try { - const response = await axios.post(`/action/content/v3/publish/${identifier}`, requestBody); + const response = await axios.post( + `/action/content/v3/publish/${identifier}`, + requestBody + ); return response.data; } catch (error) { console.error("Error during publishing:", error); @@ -170,13 +173,16 @@ export const submitComment = async (identifier: any, comment: any) => { const requestBody = { request: { content: { - rejectComment: comment - } - } + rejectComment: comment, + }, + }, }; try { - const response = await axios.post(`/action/content/v3/reject/${identifier}`, requestBody); + const response = await axios.post( + `/action/content/v3/reject/${identifier}`, + requestBody + ); return response.data; } catch (error) { console.error("Error submitting comment:", error); diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index 1c77764..55b0830 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -15,3 +15,7 @@ export const MIME_TYPE = { QUESTIONSET_MIME_TYPE: "application/vnd.sunbird.questionset", COURSE_MIME_TYPE: "application/vnd.ekstep.content-collection", }; + +export const TENANTID = { + ID: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", +}; From 85b9fceb40a32e800514201901a7ce8b9bf6656c Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Wed, 6 Nov 2024 15:55:47 +0530 Subject: [PATCH 022/126] Issue #2195 feat: Use admin app authorisation token in workspace --- src/pages/api/proxy.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index 5465e7d..ecbc948 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -4,11 +4,9 @@ import { telemetryResponse, creatLockResponse, genericEditorReviewFormResponse, - genericEditorRequestForChangesFormResponse + genericEditorRequestForChangesFormResponse, } from "./mocked-response"; -const cookie = require("cookie"); - -let storedToken: string | null = null; +import cookie from "cookie"; export default async function handler( req: NextApiRequest, @@ -22,9 +20,10 @@ export default async function handler( const API_KEY = process.env.AUTH_API_TOKEN as string; const cookies = cookie.parse(req.headers.cookie || ""); - const tokenFromCookie = cookies.authToken; - const token = API_KEY; + console.log(cookies); + + const token = cookies.authToken || API_KEY; if (!token) { console.error("No valid token available"); @@ -34,6 +33,7 @@ export default async function handler( console.log("Using token:", token); let pathString = Array.isArray(path) ? path.join("/") : (path as string); + // Handle mocked responses if (pathString === "/action/data/v3/telemetry") { return res.status(200).json(telemetryResponse); @@ -68,7 +68,7 @@ export default async function handler( queryString ? `?${queryString}` : "" }`; - console.log('targetUrl =====>', targetUrl); + console.log("targetUrl =====>", targetUrl); try { const options: RequestInit = { From 3b736b0e177a5f5d41f5abde927cc4abbd214af7 Mon Sep 17 00:00:00 2001 From: suvarnakale Date: Wed, 6 Nov 2024 16:59:21 +0530 Subject: [PATCH 023/126] Issue #PS-2346 feat: Remove duplication of assets done --- public/workspace/content/assets/add.svg | 1 - .../workspace/content/assets/arrow-right.svg | 1 - public/workspace/content/assets/badge-2.svg | 1 - .../workspace/content/assets/exit_to_app.svg | 1 - .../content/assets/iconclosedownload.svg | 1 - public/workspace/content/assets/minus.svg | 1 - .../workspace/content/assets/next-arrow.svg | 1 - .../content/assets/pdfjs/build/pdf.js | 1 - .../content/assets/pdfjs/build/pdf.worker.js | 1 - .../assets/pdfjs/web/cmaps/78-EUC-H.bcmap | Bin 2404 -> 0 bytes .../assets/pdfjs/web/cmaps/78-EUC-V.bcmap | Bin 173 -> 0 bytes .../content/assets/pdfjs/web/cmaps/78-H.bcmap | Bin 2379 -> 0 bytes .../assets/pdfjs/web/cmaps/78-RKSJ-H.bcmap | Bin 2398 -> 0 bytes .../assets/pdfjs/web/cmaps/78-RKSJ-V.bcmap | Bin 173 -> 0 bytes .../content/assets/pdfjs/web/cmaps/78-V.bcmap | Bin 169 -> 0 bytes .../assets/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap | Bin 2651 -> 0 bytes .../assets/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap | Bin 290 -> 0 bytes .../assets/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap | Bin 905 -> 0 bytes .../assets/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap | Bin 721 -> 0 bytes .../assets/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap | Bin 290 -> 0 bytes .../assets/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap | Bin 715 -> 0 bytes .../assets/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap | Bin 291 -> 0 bytes .../assets/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap | Bin 982 -> 0 bytes .../assets/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap | Bin 260 -> 0 bytes .../assets/pdfjs/web/cmaps/Add-H.bcmap | Bin 2419 -> 0 bytes .../assets/pdfjs/web/cmaps/Add-RKSJ-H.bcmap | Bin 2413 -> 0 bytes .../assets/pdfjs/web/cmaps/Add-RKSJ-V.bcmap | Bin 287 -> 0 bytes .../assets/pdfjs/web/cmaps/Add-V.bcmap | Bin 282 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap | Bin 317 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap | Bin 371 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap | Bin 376 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap | Bin 401 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap | Bin 405 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap | Bin 406 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap | Bin 406 -> 0 bytes .../pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap | Bin 41193 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-0.bcmap | Bin 217 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-1.bcmap | Bin 250 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-2.bcmap | Bin 465 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-3.bcmap | Bin 470 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-4.bcmap | Bin 601 -> 0 bytes .../assets/pdfjs/web/cmaps/Adobe-GB1-5.bcmap | Bin 625 -> 0 bytes .../pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap | Bin 33974 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-0.bcmap | Bin 225 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-1.bcmap | Bin 226 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-2.bcmap | Bin 233 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-3.bcmap | Bin 242 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-4.bcmap | Bin 337 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-5.bcmap | Bin 430 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-6.bcmap | Bin 485 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap | Bin 40951 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Korea1-0.bcmap | Bin 241 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Korea1-1.bcmap | Bin 386 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Korea1-2.bcmap | Bin 391 -> 0 bytes .../pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap | Bin 23293 -> 0 bytes .../content/assets/pdfjs/web/cmaps/B5-H.bcmap | Bin 1086 -> 0 bytes .../content/assets/pdfjs/web/cmaps/B5-V.bcmap | Bin 142 -> 0 bytes .../assets/pdfjs/web/cmaps/B5pc-H.bcmap | Bin 1099 -> 0 bytes .../assets/pdfjs/web/cmaps/B5pc-V.bcmap | Bin 144 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS-EUC-H.bcmap | Bin 1780 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS-EUC-V.bcmap | Bin 1920 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS1-H.bcmap | Bin 706 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS1-V.bcmap | Bin 143 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS2-H.bcmap | Bin 504 -> 0 bytes .../assets/pdfjs/web/cmaps/CNS2-V.bcmap | 3 - .../assets/pdfjs/web/cmaps/ETHK-B5-H.bcmap | Bin 4426 -> 0 bytes .../assets/pdfjs/web/cmaps/ETHK-B5-V.bcmap | Bin 158 -> 0 bytes .../assets/pdfjs/web/cmaps/ETen-B5-H.bcmap | Bin 1125 -> 0 bytes .../assets/pdfjs/web/cmaps/ETen-B5-V.bcmap | Bin 158 -> 0 bytes .../assets/pdfjs/web/cmaps/ETenms-B5-H.bcmap | 3 - .../assets/pdfjs/web/cmaps/ETenms-B5-V.bcmap | Bin 172 -> 0 bytes .../assets/pdfjs/web/cmaps/EUC-H.bcmap | Bin 578 -> 0 bytes .../assets/pdfjs/web/cmaps/EUC-V.bcmap | Bin 170 -> 0 bytes .../assets/pdfjs/web/cmaps/Ext-H.bcmap | Bin 2536 -> 0 bytes .../assets/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap | Bin 2542 -> 0 bytes .../assets/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap | Bin 218 -> 0 bytes .../assets/pdfjs/web/cmaps/Ext-V.bcmap | Bin 215 -> 0 bytes .../assets/pdfjs/web/cmaps/GB-EUC-H.bcmap | Bin 549 -> 0 bytes .../assets/pdfjs/web/cmaps/GB-EUC-V.bcmap | Bin 179 -> 0 bytes .../content/assets/pdfjs/web/cmaps/GB-H.bcmap | 4 - .../content/assets/pdfjs/web/cmaps/GB-V.bcmap | Bin 175 -> 0 bytes .../assets/pdfjs/web/cmaps/GBK-EUC-H.bcmap | Bin 14692 -> 0 bytes .../assets/pdfjs/web/cmaps/GBK-EUC-V.bcmap | Bin 180 -> 0 bytes .../assets/pdfjs/web/cmaps/GBK2K-H.bcmap | Bin 19662 -> 0 bytes .../assets/pdfjs/web/cmaps/GBK2K-V.bcmap | Bin 219 -> 0 bytes .../assets/pdfjs/web/cmaps/GBKp-EUC-H.bcmap | Bin 14686 -> 0 bytes .../assets/pdfjs/web/cmaps/GBKp-EUC-V.bcmap | Bin 181 -> 0 bytes .../assets/pdfjs/web/cmaps/GBT-EUC-H.bcmap | Bin 7290 -> 0 bytes .../assets/pdfjs/web/cmaps/GBT-EUC-V.bcmap | Bin 180 -> 0 bytes .../assets/pdfjs/web/cmaps/GBT-H.bcmap | Bin 7269 -> 0 bytes .../assets/pdfjs/web/cmaps/GBT-V.bcmap | Bin 176 -> 0 bytes .../assets/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap | Bin 7298 -> 0 bytes .../assets/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap | Bin 182 -> 0 bytes .../assets/pdfjs/web/cmaps/GBpc-EUC-H.bcmap | Bin 557 -> 0 bytes .../assets/pdfjs/web/cmaps/GBpc-EUC-V.bcmap | Bin 181 -> 0 bytes .../content/assets/pdfjs/web/cmaps/H.bcmap | Bin 553 -> 0 bytes .../assets/pdfjs/web/cmaps/HKdla-B5-H.bcmap | Bin 2654 -> 0 bytes .../assets/pdfjs/web/cmaps/HKdla-B5-V.bcmap | Bin 148 -> 0 bytes .../assets/pdfjs/web/cmaps/HKdlb-B5-H.bcmap | Bin 2414 -> 0 bytes .../assets/pdfjs/web/cmaps/HKdlb-B5-V.bcmap | Bin 148 -> 0 bytes .../assets/pdfjs/web/cmaps/HKgccs-B5-H.bcmap | Bin 2292 -> 0 bytes .../assets/pdfjs/web/cmaps/HKgccs-B5-V.bcmap | Bin 149 -> 0 bytes .../assets/pdfjs/web/cmaps/HKm314-B5-H.bcmap | Bin 1772 -> 0 bytes .../assets/pdfjs/web/cmaps/HKm314-B5-V.bcmap | Bin 149 -> 0 bytes .../assets/pdfjs/web/cmaps/HKm471-B5-H.bcmap | Bin 2171 -> 0 bytes .../assets/pdfjs/web/cmaps/HKm471-B5-V.bcmap | Bin 149 -> 0 bytes .../assets/pdfjs/web/cmaps/HKscs-B5-H.bcmap | Bin 4437 -> 0 bytes .../assets/pdfjs/web/cmaps/HKscs-B5-V.bcmap | Bin 159 -> 0 bytes .../assets/pdfjs/web/cmaps/Hankaku.bcmap | Bin 132 -> 0 bytes .../assets/pdfjs/web/cmaps/Hiragana.bcmap | Bin 124 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-EUC-H.bcmap | Bin 1848 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-EUC-V.bcmap | Bin 164 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-H.bcmap | Bin 1831 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-Johab-H.bcmap | Bin 16791 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-Johab-V.bcmap | Bin 166 -> 0 bytes .../assets/pdfjs/web/cmaps/KSC-V.bcmap | Bin 160 -> 0 bytes .../assets/pdfjs/web/cmaps/KSCms-UHC-H.bcmap | Bin 2787 -> 0 bytes .../pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap | Bin 2789 -> 0 bytes .../pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap | Bin 169 -> 0 bytes .../assets/pdfjs/web/cmaps/KSCms-UHC-V.bcmap | Bin 166 -> 0 bytes .../assets/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap | Bin 2024 -> 0 bytes .../assets/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap | Bin 166 -> 0 bytes .../assets/pdfjs/web/cmaps/Katakana.bcmap | Bin 100 -> 0 bytes .../content/assets/pdfjs/web/cmaps/LICENSE | 36 -- .../assets/pdfjs/web/cmaps/NWP-H.bcmap | Bin 2765 -> 0 bytes .../assets/pdfjs/web/cmaps/NWP-V.bcmap | Bin 252 -> 0 bytes .../assets/pdfjs/web/cmaps/RKSJ-H.bcmap | Bin 534 -> 0 bytes .../assets/pdfjs/web/cmaps/RKSJ-V.bcmap | Bin 170 -> 0 bytes .../assets/pdfjs/web/cmaps/Roman.bcmap | Bin 96 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap | Bin 48280 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap | Bin 156 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap | Bin 50419 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap | Bin 156 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap | Bin 52679 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap | Bin 160 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap | Bin 53629 -> 0 bytes .../pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap | Bin 157 -> 0 bytes .../assets/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap | Bin 43366 -> 0 bytes .../assets/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap | Bin 193 -> 0 bytes .../pdfjs/web/cmaps/UniGB-UTF16-H.bcmap | Bin 44086 -> 0 bytes .../pdfjs/web/cmaps/UniGB-UTF16-V.bcmap | Bin 178 -> 0 bytes .../pdfjs/web/cmaps/UniGB-UTF32-H.bcmap | Bin 45738 -> 0 bytes .../pdfjs/web/cmaps/UniGB-UTF32-V.bcmap | Bin 182 -> 0 bytes .../assets/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap | Bin 46837 -> 0 bytes .../assets/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap | Bin 181 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap | Bin 25439 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin 119 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin 680 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap | Bin 664 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap | Bin 39443 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap | Bin 643 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap | Bin 40539 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap | Bin 677 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap | Bin 41695 -> 0 bytes .../pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap | Bin 678 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap | Bin 39534 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap | Bin 647 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap | Bin 40630 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap | Bin 681 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap | Bin 41779 -> 0 bytes .../pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap | Bin 682 -> 0 bytes .../pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 705 -> 0 bytes .../pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap | Bin 689 -> 0 bytes .../pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap | Bin 726 -> 0 bytes .../pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap | Bin 40517 -> 0 bytes .../pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap | Bin 684 -> 0 bytes .../web/cmaps/UniJISX02132004-UTF32-H.bcmap | Bin 40608 -> 0 bytes .../web/cmaps/UniJISX02132004-UTF32-V.bcmap | Bin 688 -> 0 bytes .../assets/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap | Bin 25783 -> 0 bytes .../assets/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap | Bin 178 -> 0 bytes .../pdfjs/web/cmaps/UniKS-UTF16-H.bcmap | Bin 26327 -> 0 bytes .../pdfjs/web/cmaps/UniKS-UTF16-V.bcmap | Bin 164 -> 0 bytes .../pdfjs/web/cmaps/UniKS-UTF32-H.bcmap | Bin 26451 -> 0 bytes .../pdfjs/web/cmaps/UniKS-UTF32-V.bcmap | Bin 168 -> 0 bytes .../assets/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap | Bin 169 -> 0 bytes .../content/assets/pdfjs/web/cmaps/V.bcmap | Bin 166 -> 0 bytes .../assets/pdfjs/web/cmaps/WP-Symbol.bcmap | Bin 179 -> 0 bytes .../content/assets/pdfjs/web/debugger.js | 1 - .../assets/pdfjs/web/images/loading-icon.gif | Bin 2545 -> 0 bytes .../pdfjs/web/locale/en-US/viewer.properties | 247 --------- .../assets/pdfjs/web/locale/locale.properties | 2 - .../content/assets/pdfjs/web/viewer.css | 1 - .../content/assets/pdfjs/web/viewer.html | 508 ------------------ .../content/assets/pdfjs/web/viewer.js | 1 - public/workspace/content/assets/replay.svg | 1 - .../workspace/content/assets/rotate-icon.svg | 1 - public/workspace/content/assets/timer.svg | 1 - public/workspace/content/assets/user.svg | 1 - src/components/players/SunbirdEpubPlayer.tsx | 2 +- 189 files changed, 1 insertion(+), 820 deletions(-) delete mode 100644 public/workspace/content/assets/add.svg delete mode 100644 public/workspace/content/assets/arrow-right.svg delete mode 100644 public/workspace/content/assets/badge-2.svg delete mode 100644 public/workspace/content/assets/exit_to_app.svg delete mode 100644 public/workspace/content/assets/iconclosedownload.svg delete mode 100644 public/workspace/content/assets/minus.svg delete mode 100644 public/workspace/content/assets/next-arrow.svg delete mode 100644 public/workspace/content/assets/pdfjs/build/pdf.js delete mode 100644 public/workspace/content/assets/pdfjs/build/pdf.worker.js delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Add-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Add-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Add-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Add-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-0.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-1.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-3.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-4.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-5.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/B5pc-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/B5pc-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS1-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS1-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS2-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/CNS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETHK-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETHK-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETen-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETen-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETenms-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/ETenms-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Ext-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Ext-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GB-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GB-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GB-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GB-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBK-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBK-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBK2K-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBK2K-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBKp-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBKp-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBT-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBT-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBT-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBT-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBpc-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/GBpc-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKdla-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKdla-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKdlb-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKdlb-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKgccs-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKgccs-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKm314-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKm314-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKm471-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKm471-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKscs-B5-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/HKscs-B5-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Hankaku.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Hiragana.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-Johab-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-Johab-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCms-UHC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCms-UHC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Katakana.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/LICENSE delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/NWP-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/NWP-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/RKSJ-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/RKSJ-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/Roman.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/V.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/cmaps/WP-Symbol.bcmap delete mode 100644 public/workspace/content/assets/pdfjs/web/debugger.js delete mode 100644 public/workspace/content/assets/pdfjs/web/images/loading-icon.gif delete mode 100644 public/workspace/content/assets/pdfjs/web/locale/en-US/viewer.properties delete mode 100644 public/workspace/content/assets/pdfjs/web/locale/locale.properties delete mode 100644 public/workspace/content/assets/pdfjs/web/viewer.css delete mode 100644 public/workspace/content/assets/pdfjs/web/viewer.html delete mode 100644 public/workspace/content/assets/pdfjs/web/viewer.js delete mode 100644 public/workspace/content/assets/replay.svg delete mode 100644 public/workspace/content/assets/rotate-icon.svg delete mode 100644 public/workspace/content/assets/timer.svg delete mode 100644 public/workspace/content/assets/user.svg diff --git a/public/workspace/content/assets/add.svg b/public/workspace/content/assets/add.svg deleted file mode 100644 index 82ebf20..0000000 --- a/public/workspace/content/assets/add.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/arrow-right.svg b/public/workspace/content/assets/arrow-right.svg deleted file mode 100644 index a80ef79..0000000 --- a/public/workspace/content/assets/arrow-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/badge-2.svg b/public/workspace/content/assets/badge-2.svg deleted file mode 100644 index ade49b6..0000000 --- a/public/workspace/content/assets/badge-2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/exit_to_app.svg b/public/workspace/content/assets/exit_to_app.svg deleted file mode 100644 index c1a6a64..0000000 --- a/public/workspace/content/assets/exit_to_app.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/iconclosedownload.svg b/public/workspace/content/assets/iconclosedownload.svg deleted file mode 100644 index c3d947d..0000000 --- a/public/workspace/content/assets/iconclosedownload.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/minus.svg b/public/workspace/content/assets/minus.svg deleted file mode 100644 index e8a0452..0000000 --- a/public/workspace/content/assets/minus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/next-arrow.svg b/public/workspace/content/assets/next-arrow.svg deleted file mode 100644 index b0a8787..0000000 --- a/public/workspace/content/assets/next-arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/pdfjs/build/pdf.js b/public/workspace/content/assets/pdfjs/build/pdf.js deleted file mode 100644 index e054491..0000000 --- a/public/workspace/content/assets/pdfjs/build/pdf.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pdfjs-dist/build/pdf",[],t):"object"==typeof exports?exports["pdfjs-dist/build/pdf"]=t():e["pdfjs-dist/build/pdf"]=e.pdfjsLib=t()}(this,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addLinkAttributes",{enumerable:!0,get:function(){return n.addLinkAttributes}}),Object.defineProperty(t,"getFilenameFromUrl",{enumerable:!0,get:function(){return n.getFilenameFromUrl}}),Object.defineProperty(t,"LinkTarget",{enumerable:!0,get:function(){return n.LinkTarget}}),Object.defineProperty(t,"loadScript",{enumerable:!0,get:function(){return n.loadScript}}),Object.defineProperty(t,"PDFDateString",{enumerable:!0,get:function(){return n.PDFDateString}}),Object.defineProperty(t,"RenderingCancelledException",{enumerable:!0,get:function(){return n.RenderingCancelledException}}),Object.defineProperty(t,"build",{enumerable:!0,get:function(){return i.build}}),Object.defineProperty(t,"getDocument",{enumerable:!0,get:function(){return i.getDocument}}),Object.defineProperty(t,"LoopbackPort",{enumerable:!0,get:function(){return i.LoopbackPort}}),Object.defineProperty(t,"PDFDataRangeTransport",{enumerable:!0,get:function(){return i.PDFDataRangeTransport}}),Object.defineProperty(t,"PDFWorker",{enumerable:!0,get:function(){return i.PDFWorker}}),Object.defineProperty(t,"version",{enumerable:!0,get:function(){return i.version}}),Object.defineProperty(t,"CMapCompressionType",{enumerable:!0,get:function(){return a.CMapCompressionType}}),Object.defineProperty(t,"createObjectURL",{enumerable:!0,get:function(){return a.createObjectURL}}),Object.defineProperty(t,"createPromiseCapability",{enumerable:!0,get:function(){return a.createPromiseCapability}}),Object.defineProperty(t,"createValidAbsoluteUrl",{enumerable:!0,get:function(){return a.createValidAbsoluteUrl}}),Object.defineProperty(t,"InvalidPDFException",{enumerable:!0,get:function(){return a.InvalidPDFException}}),Object.defineProperty(t,"MissingPDFException",{enumerable:!0,get:function(){return a.MissingPDFException}}),Object.defineProperty(t,"OPS",{enumerable:!0,get:function(){return a.OPS}}),Object.defineProperty(t,"PasswordResponses",{enumerable:!0,get:function(){return a.PasswordResponses}}),Object.defineProperty(t,"PermissionFlag",{enumerable:!0,get:function(){return a.PermissionFlag}}),Object.defineProperty(t,"removeNullCharacters",{enumerable:!0,get:function(){return a.removeNullCharacters}}),Object.defineProperty(t,"shadow",{enumerable:!0,get:function(){return a.shadow}}),Object.defineProperty(t,"UnexpectedResponseException",{enumerable:!0,get:function(){return a.UnexpectedResponseException}}),Object.defineProperty(t,"UNSUPPORTED_FEATURES",{enumerable:!0,get:function(){return a.UNSUPPORTED_FEATURES}}),Object.defineProperty(t,"Util",{enumerable:!0,get:function(){return a.Util}}),Object.defineProperty(t,"VerbosityLevel",{enumerable:!0,get:function(){return a.VerbosityLevel}}),Object.defineProperty(t,"AnnotationLayer",{enumerable:!0,get:function(){return o.AnnotationLayer}}),Object.defineProperty(t,"apiCompatibilityParams",{enumerable:!0,get:function(){return s.apiCompatibilityParams}}),Object.defineProperty(t,"GlobalWorkerOptions",{enumerable:!0,get:function(){return u.GlobalWorkerOptions}}),Object.defineProperty(t,"renderTextLayer",{enumerable:!0,get:function(){return c.renderTextLayer}}),Object.defineProperty(t,"SVGGraphics",{enumerable:!0,get:function(){return l.SVGGraphics}});var n=r(1),i=r(198),a=r(5),o=r(209),s=r(200),u=r(203),c=r(210),l=r(211);if(r(7).isNodeJS){var f=r(212).PDFNodeStream;(0,i.setPDFNetworkStreamFactory)(function(e){return new f(e)})}else{var h,d=r(215).PDFNetworkStream;(0,n.isFetchSupported)()&&(h=r(216).PDFFetchStream),(0,i.setPDFNetworkStreamFactory)(function(e){return h&&(0,n.isValidFetchUrl)(e.url)?new h(e):new d(e)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addLinkAttributes=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.url,n=t.target,i=t.rel,o=t.enabled,s=void 0===o||o;(0,a.assert)(r&&"string"==typeof r,'addLinkAttributes: A valid "url" parameter must provided.');var u=(0,a.removeNullCharacters)(r);s?e.href=e.title=u:(e.href="",e.title="Disabled: ".concat(u),e.onclick=function(){return!1});var c="";switch(n){case k.NONE:break;case k.SELF:c="_self";break;case k.BLANK:c="_blank";break;case k.PARENT:c="_parent";break;case k.TOP:c="_top"}e.target=c,e.rel="string"==typeof i?i:g},t.getFilenameFromUrl=function(e){var t=e.indexOf("#"),r=e.indexOf("?"),n=Math.min(t>0?t:e.length,r>0?r:e.length);return e.substring(e.lastIndexOf("/",n)+1,n)},t.isFetchSupported=R,t.isValidFetchUrl=P,t.loadScript=function(e){return new Promise(function(t,r){var n=document.createElement("script");n.src=e,n.onload=t,n.onerror=function(){r(new Error("Cannot load script at: ".concat(n.src)))},(document.head||document.documentElement).appendChild(n)})},t.deprecated=function(e){console.log("Deprecated API usage: "+e)},t.PDFDateString=t.StatTimer=t.DOMSVGFactory=t.DOMCMapReaderFactory=t.DOMCanvasFactory=t.DEFAULT_LINK_REL=t.LinkTarget=t.RenderingCancelledException=t.PageViewport=void 0;var n,i=(n=r(2))&&n.__esModule?n:{default:n},a=r(5);function o(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,u=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return o=e.done,e},e:function(e){u=!0,a=e},f:function(){try{o||null==r.return||r.return()}finally{if(u)throw a}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&t>0,"Invalid SVG dimensions");var r=document.createElementNS(m,"svg:svg");return r.setAttribute("version","1.1"),r.setAttribute("width",e+"px"),r.setAttribute("height",t+"px"),r.setAttribute("preserveAspectRatio","none"),r.setAttribute("viewBox","0 0 "+e+" "+t),r}},{key:"createElement",value:function(e){return(0,a.assert)("string"==typeof e,"Invalid SVG element type"),document.createElementNS(m,e)}}]),e}();t.DOMSVGFactory=A;var S=function(){function e(t){var r=t.viewBox,n=t.scale,i=t.rotation,a=t.offsetX,o=void 0===a?0:a,s=t.offsetY,u=void 0===s?0:s,c=t.dontFlip,l=void 0!==c&&c;p(this,e),this.viewBox=r,this.scale=n,this.rotation=i,this.offsetX=o,this.offsetY=u;var f,h,d,v,y,g,m,b,_=(r[2]+r[0])/2,A=(r[3]+r[1])/2;switch(i=(i%=360)<0?i+360:i){case 180:f=-1,h=0,d=0,v=1;break;case 90:f=0,h=1,d=1,v=0;break;case 270:f=0,h=-1,d=-1,v=0;break;case 0:f=1,h=0,d=0,v=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}l&&(d=-d,v=-v),0===f?(y=Math.abs(A-r[1])*n+o,g=Math.abs(_-r[0])*n+u,m=Math.abs(r[3]-r[1])*n,b=Math.abs(r[2]-r[0])*n):(y=Math.abs(_-r[0])*n+o,g=Math.abs(A-r[1])*n+u,m=Math.abs(r[2]-r[0])*n,b=Math.abs(r[3]-r[1])*n),this.transform=[f*n,h*n,d*n,v*n,y-f*n*_-d*n*A,g-h*n*_-v*n*A],this.width=m,this.height=b}return y(e,[{key:"clone",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.scale,n=void 0===r?this.scale:r,i=t.rotation,a=void 0===i?this.rotation:i,o=t.offsetX,s=void 0===o?this.offsetX:o,u=t.offsetY,c=void 0===u?this.offsetY:u,l=t.dontFlip,f=void 0!==l&&l;return new e({viewBox:this.viewBox.slice(),scale:n,rotation:a,offsetX:s,offsetY:c,dontFlip:f})}},{key:"convertToViewportPoint",value:function(e,t){return a.Util.applyTransform([e,t],this.transform)}},{key:"convertToViewportRectangle",value:function(e){var t=a.Util.applyTransform([e[0],e[1]],this.transform),r=a.Util.applyTransform([e[2],e[3]],this.transform);return[t[0],t[1],r[0],r[1]]}},{key:"convertToPdfPoint",value:function(e,t){return a.Util.applyInverseTransform([e,t],this.transform)}}]),e}();t.PageViewport=S;var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}(r,a.BaseException);var t=l(r);function r(e,n){var i;return p(this,r),(i=t.call(this,e)).type=n,i}return r}();t.RenderingCancelledException=w;var k={NONE:0,SELF:1,BLANK:2,PARENT:3,TOP:4};t.LinkTarget=k;var x,C=function(){function e(){p(this,e),this.started=Object.create(null),this.times=[]}return y(e,[{key:"time",value:function(e){e in this.started&&(0,a.warn)("Timer is already running for ".concat(e)),this.started[e]=Date.now()}},{key:"timeEnd",value:function(e){e in this.started||(0,a.warn)("Timer has not been started for ".concat(e)),this.times.push({name:e,start:this.started[e],end:Date.now()}),delete this.started[e]}},{key:"toString",value:function(){var e,t=[],r=0,n=o(this.times);try{for(n.s();!(e=n.n()).done;){var i=e.value.name;i.length>r&&(r=i.length)}}catch(e){n.e(e)}finally{n.f()}var a,s=o(this.times);try{for(s.s();!(a=s.n()).done;){var u=a.value,c=u.end-u.start;t.push("".concat(u.name.padEnd(r)," ").concat(c,"ms\n"))}}catch(e){s.e(e)}finally{s.f()}return t.join("")}}]),e}();function R(){return"undefined"!=typeof fetch&&"undefined"!=typeof Response&&"body"in Response.prototype&&"undefined"!=typeof ReadableStream}function P(e,t){try{var r=(t?new URL(e,t):new URL(e)).protocol;return"http:"===r||"https:"===r}catch(e){return!1}}t.StatTimer=C;var T=function(){function e(){p(this,e)}return y(e,null,[{key:"toDateObject",value:function(e){if(!e||!(0,a.isString)(e))return null;x||(x=new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));var t=x.exec(e);if(!t)return null;var r=parseInt(t[1],10),n=parseInt(t[2],10);n=n>=1&&n<=12?n-1:0;var i=parseInt(t[3],10);i=i>=1&&i<=31?i:1;var o=parseInt(t[4],10);o=o>=0&&o<=23?o:0;var s=parseInt(t[5],10);s=s>=0&&s<=59?s:0;var u=parseInt(t[6],10);u=u>=0&&u<=59?u:0;var c=t[7]||"Z",l=parseInt(t[8],10);l=l>=0&&l<=23?l:0;var f=parseInt(t[9],10)||0;return f=f>=0&&f<=59?f:0,"-"===c?(o+=l,s+=f):"+"===c&&(o-=l,s-=f),new Date(Date.UTC(r,n,i,o,s,u))}}]),e}();t.PDFDateString=T},function(e,t,r){"use strict";e.exports=r(3)},function(e,t,r){"use strict";(function(e){function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var r=function(e){var r,n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(e,t,r,n){var i=t&&t.prototype instanceof y?t:y,a=Object.create(i.prototype),o=new P(n||[]);return a._invoke=function(e,t,r){var n=f;return function(i,a){if(n===d)throw new Error("Generator is already running");if(n===p){if("throw"===i)throw a;return E()}for(r.method=i,r.arg=a;;){var o=r.delegate;if(o){var s=x(o,r);if(s){if(s===v)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=p,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=d;var u=l(e,t,r);if("normal"===u.type){if(n=r.done?p:h,u.arg===v)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n=p,r.method="throw",r.arg=u.arg)}}}(e,r,o),a}function l(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var f="suspendedStart",h="suspendedYield",d="executing",p="completed",v={};function y(){}function g(){}function m(){}var b={};b[o]=function(){return this};var _=Object.getPrototypeOf,A=_&&_(_(T([])));A&&A!==n&&i.call(A,o)&&(b=A);var S=m.prototype=y.prototype=Object.create(b);function w(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function k(e,r){var n;this._invoke=function(a,o){function s(){return new r(function(n,s){!function n(a,o,s,u){var c=l(e[a],e,o);if("throw"!==c.type){var f=c.arg,h=f.value;return h&&"object"===t(h)&&i.call(h,"__await")?r.resolve(h.__await).then(function(e){n("next",e,s,u)},function(e){n("throw",e,s,u)}):r.resolve(h).then(function(e){f.value=e,s(f)},function(e){return n("throw",e,s,u)})}u(c.arg)}(a,o,n,s)})}return n=n?n.then(s,s):s()}}function x(e,t){var n=e.iterator[t.method];if(n===r){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=r,x(e,t),"throw"===t.method))return v;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var i=l(n,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,v;var a=i.arg;return a?a.done?(t[e.resultName]=a.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=r),t.delegate=null,v):a:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,v)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function R(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(C,this),this.reset(!0)}function T(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,a=function t(){for(;++n=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=i.call(o,"catchLoc"),c=i.call(o,"finallyLoc");if(u&&c){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&i.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),R(r),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var i=n.arg;R(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:T(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=r),v}},e}("object"===t(e)?e.exports:{});try{regeneratorRuntime=r}catch(e){Function("r","regeneratorRuntime = r")(r)}}).call(this,r(4)(e))},function(e,t,r){"use strict";e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,r){"use strict";function n(e,t){for(var r=0;r=l.INFOS&&console.log("Info: ".concat(e))},t.isArrayBuffer=function(e){return"object"===i(e)&&null!==e&&void 0!==e.byteLength},t.isArrayEqual=function(e,t){if(e.length!==t.length)return!1;return e.every(function(e,r){return e===t[r]})},t.isBool=function(e){return"boolean"==typeof e},t.isEmptyObj=function(e){for(var t in e)return!1;return!0},t.isNum=function(e){return"number"==typeof e},t.isString=function(e){return"string"==typeof e},t.isSameOrigin=function(e,t){var r;try{if(!(r=new URL(e)).origin||"null"===r.origin)return!1}catch(e){return!1}var n=new URL(t,r);return r.origin===n.origin},t.createValidAbsoluteUrl=function(e,t){if(!e)return null;try{var r=t?new URL(e,t):new URL(e);if(function(e){if(!e)return!1;switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(r))return r}catch(e){}return null},t.removeNullCharacters=function(e){if("string"!=typeof e)return h("The argument for removeNullCharacters must be a string."),e;return e.replace(k,"")},t.setVerbosityLevel=function(e){Number.isInteger(e)&&(f=e)},t.shadow=v,t.string32=function(e){return String.fromCharCode(e>>24&255,e>>16&255,e>>8&255,255&e)},t.stringToBytes=x,t.stringToPDFString=function(e){var t=e.length,r=[];if("þ"===e[0]&&"ÿ"===e[1])for(var n=2;n=l.WARNINGS&&console.log("Warning: ".concat(e))}function d(e){throw new Error(e)}function p(e,t){e||d(t)}function v(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!1}),r}var y=function(){function e(t){this.constructor===e&&d("Cannot initialize BaseException."),this.message=t,this.name=this.constructor.name}return e.prototype=new Error,e.constructor=e,e}();t.BaseException=y;var g=function(e){o(r,y);var t=u(r);function r(e,n){var i;return a(this,r),(i=t.call(this,e)).code=n,i}return r}();t.PasswordException=g;var m=function(e){o(r,y);var t=u(r);function r(e,n){var i;return a(this,r),(i=t.call(this,e)).details=n,i}return r}();t.UnknownErrorException=m;var b=function(e){o(r,y);var t=u(r);function r(){return a(this,r),t.apply(this,arguments)}return r}();t.InvalidPDFException=b;var _=function(e){o(r,y);var t=u(r);function r(){return a(this,r),t.apply(this,arguments)}return r}();t.MissingPDFException=_;var A=function(e){o(r,y);var t=u(r);function r(e,n){var i;return a(this,r),(i=t.call(this,e)).status=n,i}return r}();t.UnexpectedResponseException=A;var S=function(e){o(r,y);var t=u(r);function r(){return a(this,r),t.apply(this,arguments)}return r}();t.FormatError=S;var w=function(e){o(r,y);var t=u(r);function r(){return a(this,r),t.apply(this,arguments)}return r}();t.AbortException=w;var k=/\x00/g;function x(e){p("string"==typeof e,"Invalid argument for stringToBytes");for(var t=e.length,r=new Uint8Array(t),n=0;ne[2]&&(t[0]=e[2],t[2]=e[0]),e[1]>e[3]&&(t[1]=e[3],t[3]=e[1]),t}},{key:"intersect",value:function(t,r){function n(e,t){return e-t}var i=[t[0],t[2],r[0],r[2]].sort(n),a=[t[1],t[3],r[1],r[3]].sort(n),o=[];return t=e.normalizeRect(t),r=e.normalizeRect(r),i[0]===t[0]&&i[1]===r[0]||i[0]===r[0]&&i[1]===t[0]?(o[0]=i[1],o[2]=i[2],a[0]===t[1]&&a[1]===r[1]||a[0]===r[1]&&a[1]===t[1]?(o[1]=a[1],o[3]=a[2],o):null):null}}],(r=null)&&n(t.prototype,r),i&&n(t,i),e}();t.Util=E;var O=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];var F,L=(F="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",function(e,t){if(!(arguments.length>2&&void 0!==arguments[2]&&arguments[2])&&URL.createObjectURL){var r=new Blob([e],{type:t});return URL.createObjectURL(r)}for(var n="data:".concat(t,";base64,"),i=0,a=e.length;i>2]+F[(3&o)<<4|s>>4]+F[i+1>6:64]+F[i+21?!!arguments[1]:!this.contains(e);return this[t?"add":"remove"](e),t}),function(){if(a&&s){var e=window.history.pushState,t=window.history.replaceState;window.history.pushState=function(t,r,n){var i=void 0===n?[t,r]:[t,r,n];e.apply(this,i)},window.history.replaceState=function(e,r,n){var i=void 0===n?[e,r]:[e,r,n];t.apply(this,i)}}}(),String.prototype.startsWith||r(53),String.prototype.endsWith||r(64),String.prototype.includes||r(66),Array.prototype.includes||r(68),Array.from||r(76),Object.assign||r(98),Math.log2||(Math.log2=r(101)),Number.isNaN||(Number.isNaN=r(103)),Number.isInteger||(Number.isInteger=r(105)),Uint8Array.prototype.slice||r(108),globalThis.Promise&&globalThis.Promise.allSettled||(globalThis.Promise=r(113)),globalThis.URL=r(136),function(){var e=!1;if("undefined"!=typeof ReadableStream)try{new ReadableStream({start:function(e){e.close()}}),e=!0}catch(e){}e||(globalThis.ReadableStream=r(143).ReadableStream)}(),globalThis.Map&&globalThis.Map.prototype.entries||(globalThis.Map=r(144)),globalThis.Set&&globalThis.Set.prototype.entries||(globalThis.Set=r(151)),globalThis.WeakMap||(globalThis.WeakMap=r(153)),globalThis.WeakSet||(globalThis.WeakSet=r(159)),String.prototype.codePointAt||r(161),String.fromCodePoint||(String.fromCodePoint=r(163)),globalThis.Symbol||r(165),String.prototype.padStart||r(188),String.prototype.padEnd||r(193),Object.values||(Object.values=r(195))}},function(e,t,r){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.isNodeJS=void 0;var i="object"===("undefined"==typeof process?"undefined":n(process))&&process+""=="[object process]"&&!process.versions.nw&&!process.versions.electron;t.isNodeJS=i},function(e,t,r){r(9),e.exports=r(11)},function(e,t,r){r(10)({global:!0},{globalThis:r(11)})},function(e,t,r){var n=r(11),i=r(12).f,a=r(26),o=r(29),s=r(30),u=r(40),c=r(52);e.exports=function(e,t){var r,l,f,h,d,p=e.target,v=e.global,y=e.stat;if(r=v?n:y?n[p]||s(p,{}):(n[p]||{}).prototype)for(l in t){if(h=t[l],f=e.noTargetGet?(d=i(r,l))&&d.value:r[l],!c(v?l:p+(y?".":"#")+l,e.forced)&&void 0!==f){if(typeof h==typeof f)continue;u(h,f)}(e.sham||f&&f.sham)&&a(h,"sham",!0),o(r,l,h,e)}}},function(e,t){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof global&&global)||Function("return this")()},function(e,t,r){var n=r(13),i=r(15),a=r(16),o=r(17),s=r(21),u=r(23),c=r(24),l=Object.getOwnPropertyDescriptor;t.f=n?l:function(e,t){if(e=o(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return a(!i.f.call(e,t),e[t])}},function(e,t,r){var n=r(14);e.exports=!n(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,r){"use strict";var n={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,a=i&&!n.call({1:2},1);t.f=a?function(e){var t=i(this,e);return!!t&&t.enumerable}:n},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){var n=r(18),i=r(20);e.exports=function(e){return n(i(e))}},function(e,t,r){var n=r(14),i=r(19),a="".split;e.exports=n(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?a.call(e,""):Object(e)}:Object},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(22);e.exports=function(e,t){if(!n(e))return e;var r,i;if(t&&"function"==typeof(r=e.toString)&&!n(i=r.call(e)))return i;if("function"==typeof(r=e.valueOf)&&!n(i=r.call(e)))return i;if(!t&&"function"==typeof(r=e.toString)&&!n(i=r.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(13),i=r(14),a=r(25);e.exports=!n&&!i(function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(11),i=r(22),a=n.document,o=i(a)&&i(a.createElement);e.exports=function(e){return o?a.createElement(e):{}}},function(e,t,r){var n=r(13),i=r(27),a=r(16);e.exports=n?function(e,t,r){return i.f(e,t,a(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(13),i=r(24),a=r(28),o=r(21),s=Object.defineProperty;t.f=n?s:function(e,t,r){if(a(e),t=o(t,!0),a(r),i)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){var n=r(22);e.exports=function(e){if(!n(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t,r){var n=r(11),i=r(26),a=r(23),o=r(30),s=r(31),u=r(33),c=u.get,l=u.enforce,f=String(String).split("String");(e.exports=function(e,t,r,s){var u=!!s&&!!s.unsafe,c=!!s&&!!s.enumerable,h=!!s&&!!s.noTargetGet;"function"==typeof r&&("string"!=typeof t||a(r,"name")||i(r,"name",t),l(r).source=f.join("string"==typeof t?t:"")),e!==n?(u?!h&&e[t]&&(c=!0):delete e[t],c?e[t]=r:i(e,t,r)):c?e[t]=r:o(t,r)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||s(this)})},function(e,t,r){var n=r(11),i=r(26);e.exports=function(e,t){try{i(n,e,t)}catch(r){n[e]=t}return t}},function(e,t,r){var n=r(32),i=Function.toString;"function"!=typeof n.inspectSource&&(n.inspectSource=function(e){return i.call(e)}),e.exports=n.inspectSource},function(e,t,r){var n=r(11),i=r(30),a=n["__core-js_shared__"]||i("__core-js_shared__",{});e.exports=a},function(e,t,r){var n,i,a,o=r(34),s=r(11),u=r(22),c=r(26),l=r(23),f=r(35),h=r(39),d=s.WeakMap;if(o){var p=new d,v=p.get,y=p.has,g=p.set;n=function(e,t){return g.call(p,e,t),t},i=function(e){return v.call(p,e)||{}},a=function(e){return y.call(p,e)}}else{var m=f("state");h[m]=!0,n=function(e,t){return c(e,m,t),t},i=function(e){return l(e,m)?e[m]:{}},a=function(e){return l(e,m)}}e.exports={set:n,get:i,has:a,enforce:function(e){return a(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!u(t)||(r=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return r}}}},function(e,t,r){var n=r(11),i=r(31),a=n.WeakMap;e.exports="function"==typeof a&&/native code/.test(i(a))},function(e,t,r){var n=r(36),i=r(38),a=n("keys");e.exports=function(e){return a[e]||(a[e]=i(e))}},function(e,t,r){var n=r(37),i=r(32);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:n?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports=!1},function(e,t){var r=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++r+n).toString(36)}},function(e,t){e.exports={}},function(e,t,r){var n=r(23),i=r(41),a=r(12),o=r(27);e.exports=function(e,t){for(var r=i(t),s=o.f,u=a.f,c=0;cu;)n(s,r=t[u++])&&(~a(c,r)||c.push(r));return c}},function(e,t,r){var n=r(17),i=r(47),a=r(49),o=function(e){return function(t,r,o){var s,u=n(t),c=i(u.length),l=a(o,c);if(e&&r!=r){for(;c>l;)if((s=u[l++])!=s)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===r)return e||l||0;return!e&&-1}};e.exports={includes:o(!0),indexOf:o(!1)}},function(e,t,r){var n=r(48),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t,r){var n=r(48),i=Math.max,a=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):a(r,t)}},function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,r){var n=r(14),i=/#|\.prototype\./,a=function(e,t){var r=s[o(e)];return r==c||r!=u&&("function"==typeof t?n(t):!!t)},o=a.normalize=function(e){return String(e).replace(i,".").toLowerCase()},s=a.data={},u=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},function(e,t,r){r(54);var n=r(61);e.exports=n("String","startsWith")},function(e,t,r){"use strict";var n,i=r(10),a=r(12).f,o=r(47),s=r(55),u=r(20),c=r(60),l=r(37),f="".startsWith,h=Math.min,d=c("startsWith");i({target:"String",proto:!0,forced:!!(l||d||(n=a(String.prototype,"startsWith"),!n||n.writable))&&!d},{startsWith:function(e){var t=String(u(this));s(e);var r=o(h(arguments.length>1?arguments[1]:void 0,t.length)),n=String(e);return f?f.call(t,n,r):t.slice(r,r+n.length)===n}})},function(e,t,r){var n=r(56);e.exports=function(e){if(n(e))throw TypeError("The method doesn't accept regular expressions");return e}},function(e,t,r){var n=r(22),i=r(19),a=r(57)("match");e.exports=function(e){var t;return n(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==i(e))}},function(e,t,r){var n=r(11),i=r(36),a=r(23),o=r(38),s=r(58),u=r(59),c=i("wks"),l=n.Symbol,f=u?l:l&&l.withoutSetter||o;e.exports=function(e){return a(c,e)||(s&&a(l,e)?c[e]=l[e]:c[e]=f("Symbol."+e)),c[e]}},function(e,t,r){var n=r(14);e.exports=!!Object.getOwnPropertySymbols&&!n(function(){return!String(Symbol())})},function(e,t,r){var n=r(58);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,r){var n=r(57)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n]=!1,"/./"[e](t)}catch(e){}}return!1}},function(e,t,r){var n=r(11),i=r(62),a=Function.call;e.exports=function(e,t,r){return i(a,n[e].prototype[t],r)}},function(e,t,r){var n=r(63);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,r){r(65);var n=r(61);e.exports=n("String","endsWith")},function(e,t,r){"use strict";var n,i=r(10),a=r(12).f,o=r(47),s=r(55),u=r(20),c=r(60),l=r(37),f="".endsWith,h=Math.min,d=c("endsWith");i({target:"String",proto:!0,forced:!!(l||d||(n=a(String.prototype,"endsWith"),!n||n.writable))&&!d},{endsWith:function(e){var t=String(u(this));s(e);var r=arguments.length>1?arguments[1]:void 0,n=o(t.length),i=void 0===r?n:h(o(r),n),a=String(e);return f?f.call(t,a,i):t.slice(i-a.length,i)===a}})},function(e,t,r){r(67);var n=r(61);e.exports=n("String","includes")},function(e,t,r){"use strict";var n=r(10),i=r(55),a=r(20);n({target:"String",proto:!0,forced:!r(60)("includes")},{includes:function(e){return!!~String(a(this)).indexOf(i(e),arguments.length>1?arguments[1]:void 0)}})},function(e,t,r){r(69);var n=r(61);e.exports=n("Array","includes")},function(e,t,r){"use strict";var n=r(10),i=r(46).includes,a=r(70);n({target:"Array",proto:!0,forced:!r(75)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),a("includes")},function(e,t,r){var n=r(57),i=r(71),a=r(27),o=n("unscopables"),s=Array.prototype;null==s[o]&&a.f(s,o,{configurable:!0,value:i(null)}),e.exports=function(e){s[o][e]=!0}},function(e,t,r){var n,i=r(28),a=r(72),o=r(50),s=r(39),u=r(74),c=r(25),l=r(35),f=l("IE_PROTO"),h=function(){},d=function(e){return" - - - - - -
- -
-
-
- - - -
-
-
-
-
- - -
- -
- -
- - - - - - - - - - - - - - - - - -
-
-
- - -
- - - -
-
- - - - \ No newline at end of file diff --git a/public/workspace/content/assets/pdfjs/web/viewer.js b/public/workspace/content/assets/pdfjs/web/viewer.js deleted file mode 100644 index 07bc5f0..0000000 --- a/public/workspace/content/assets/pdfjs/web/viewer.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";var i,r;function a(){var e={appContainer:document.body,mainContainer:document.getElementById("viewerContainer"),viewerContainer:document.getElementById("viewer"),eventBus:null,toolbar:{container:document.getElementById("toolbarViewer"),numPages:document.getElementById("numPages"),pageNumber:document.getElementById("pageNumber"),scaleSelectContainer:document.getElementById("scaleSelectContainer"),scaleSelect:document.getElementById("scaleSelect"),customScaleOption:document.getElementById("customScaleOption"),previous:document.getElementById("previous"),next:document.getElementById("next"),zoomIn:document.getElementById("zoomIn"),zoomOut:document.getElementById("zoomOut"),viewFind:document.getElementById("viewFind"),openFile:document.getElementById("openFile"),print:document.getElementById("print"),presentationModeButton:document.getElementById("presentationMode"),download:document.getElementById("download"),viewBookmark:document.getElementById("viewBookmark")},secondaryToolbar:{toolbar:document.getElementById("secondaryToolbar"),toggleButton:document.getElementById("secondaryToolbarToggle"),toolbarButtonContainer:document.getElementById("secondaryToolbarButtonContainer"),presentationModeButton:document.getElementById("secondaryPresentationMode"),openFileButton:document.getElementById("secondaryOpenFile"),printButton:document.getElementById("secondaryPrint"),downloadButton:document.getElementById("secondaryDownload"),viewBookmarkButton:document.getElementById("secondaryViewBookmark"),firstPageButton:document.getElementById("firstPage"),lastPageButton:document.getElementById("lastPage"),pageRotateCwButton:document.getElementById("pageRotateCw"),pageRotateCcwButton:document.getElementById("pageRotateCcw"),cursorSelectToolButton:document.getElementById("cursorSelectTool"),cursorHandToolButton:document.getElementById("cursorHandTool"),scrollVerticalButton:document.getElementById("scrollVertical"),scrollHorizontalButton:document.getElementById("scrollHorizontal"),scrollWrappedButton:document.getElementById("scrollWrapped"),spreadNoneButton:document.getElementById("spreadNone"),spreadOddButton:document.getElementById("spreadOdd"),spreadEvenButton:document.getElementById("spreadEven"),documentPropertiesButton:document.getElementById("documentProperties")},fullscreen:{contextFirstPage:document.getElementById("contextFirstPage"),contextLastPage:document.getElementById("contextLastPage"),contextPageRotateCw:document.getElementById("contextPageRotateCw"),contextPageRotateCcw:document.getElementById("contextPageRotateCcw")},sidebar:{outerContainer:document.getElementById("outerContainer"),viewerContainer:document.getElementById("viewerContainer"),toggleButton:document.getElementById("sidebarToggle"),thumbnailButton:document.getElementById("viewThumbnail"),outlineButton:document.getElementById("viewOutline"),attachmentsButton:document.getElementById("viewAttachments"),thumbnailView:document.getElementById("thumbnailView"),outlineView:document.getElementById("outlineView"),attachmentsView:document.getElementById("attachmentsView")},sidebarResizer:{outerContainer:document.getElementById("outerContainer"),resizer:document.getElementById("sidebarResizer")},findBar:{bar:document.getElementById("findbar"),toggleButton:document.getElementById("viewFind"),findField:document.getElementById("findInput"),highlightAllCheckbox:document.getElementById("findHighlightAll"),caseSensitiveCheckbox:document.getElementById("findMatchCase"),entireWordCheckbox:document.getElementById("findEntireWord"),findMsg:document.getElementById("findMsg"),findResultsCount:document.getElementById("findResultsCount"),findPreviousButton:document.getElementById("findPrevious"),findNextButton:document.getElementById("findNext")},passwordOverlay:{overlayName:"passwordOverlay",container:document.getElementById("passwordOverlay"),label:document.getElementById("passwordText"),input:document.getElementById("password"),submitButton:document.getElementById("passwordSubmit"),cancelButton:document.getElementById("passwordCancel")},documentProperties:{overlayName:"documentPropertiesOverlay",container:document.getElementById("documentPropertiesOverlay"),closeButton:document.getElementById("documentPropertiesClose"),fields:{fileName:document.getElementById("fileNameField"),fileSize:document.getElementById("fileSizeField"),title:document.getElementById("titleField"),author:document.getElementById("authorField"),subject:document.getElementById("subjectField"),keywords:document.getElementById("keywordsField"),creationDate:document.getElementById("creationDateField"),modificationDate:document.getElementById("modificationDateField"),creator:document.getElementById("creatorField"),producer:document.getElementById("producerField"),version:document.getElementById("versionField"),pageCount:document.getElementById("pageCountField"),pageSize:document.getElementById("pageSizeField"),linearized:document.getElementById("linearizedField")}},errorWrapper:{container:document.getElementById("errorWrapper"),errorMessage:document.getElementById("errorMessage"),closeButton:document.getElementById("errorClose"),errorMoreInfo:document.getElementById("errorMoreInfo"),moreInfoButton:document.getElementById("errorShowMore"),lessInfoButton:document.getElementById("errorShowLess")},printContainer:document.getElementById("printContainer"),openFileInputName:"fileInput",debuggerScriptPath:"./debugger.js"};window.PDFViewerApplication=i.PDFViewerApplication,window.PDFViewerApplicationOptions=r.AppOptions;var t=document.createEvent("CustomEvent");t.initCustomEvent("webviewerloaded",!0,!0,{source:window});try{parent.document.dispatchEvent(t)}catch(e){console.error("webviewerloaded: ".concat(e)),document.dispatchEvent(t)}i.PDFViewerApplication.run(e)}i=n(1),r=n(6),n(36),n(41),"interactive"===document.readyState||"complete"===document.readyState?a():document.addEventListener("DOMContentLoaded",a,!0)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFPrintServiceFactory=t.DefaultExternalServices=t.PDFViewerApplication=void 0;var i,r=(i=n(2))&&i.__esModule?i:{default:i},a=n(5),o=n(6),s=n(8),u=n(9),l=n(11),c=n(12),d=n(13),h=n(14),f=n(15),p=n(16),v=n(17),g=n(18),m=n(20),y=n(21),b=n(22),w=n(23),_=n(24),P=n(25),S=n(27),k=n(32),E=n(34),L=n(35);function C(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=I(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}function x(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],i=!0,r=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,a=e}finally{try{i||null==s.return||s.return()}finally{if(r)throw a}}return n}(e,t)||I(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function I(e,t){if(e){if("string"==typeof e)return T(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?T(e,t):void 0}}function T(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0&&t0&&t>a.MIN_SCALE);this.pdfViewer.currentScaleValue=t}},zoomReset:function(){this.pdfViewer.isInPresentationMode||(this.pdfViewer.currentScaleValue=a.DEFAULT_SCALE_VALUE)},get pagesCount(){return this.pdfDocument?this.pdfDocument.numPages:0},get page(){return this.pdfViewer.currentPageNumber},set page(e){this.pdfViewer.currentPageNumber=e},get printing(){return!!this.printService},get supportsPrinting(){return Ve.instance.supportsPrinting},get supportsFullscreen(){var e,t=document.documentElement;return e=!!(t.requestFullscreen||t.mozRequestFullScreen||t.webkitRequestFullScreen||t.msRequestFullscreen),!1!==document.fullscreenEnabled&&!1!==document.mozFullScreenEnabled&&!1!==document.webkitFullscreenEnabled&&!1!==document.msFullscreenEnabled||(e=!1),(0,s.shadow)(this,"supportsFullscreen",e)},get supportsIntegratedFind(){return this.externalServices.supportsIntegratedFind},get supportsDocumentFonts(){return this.externalServices.supportsDocumentFonts},get loadingBar(){var e=new a.ProgressBar("#loadingBar");return(0,s.shadow)(this,"loadingBar",e)},get supportedMouseWheelZoomModifierKeys(){return this.externalServices.supportedMouseWheelZoomModifierKeys},initPassiveLoading:function(){throw new Error("Not implemented: initPassiveLoading")},setTitleUsingUrl:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";this.url=e,this.baseUrl=e.split("#")[0];var t=(0,a.getPDFFileNameFromURL)(e,"");if(!t)try{t=decodeURIComponent((0,s.getFilenameFromUrl)(e))||e}catch(n){t=e}this.setTitle(t)},setTitle:function(e){this.isViewerEmbedded||(document.title=e)},close:function(){var e=this;return M(r.default.mark(function t(){var n;return r.default.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(e.appConfig.errorWrapper.container.setAttribute("hidden","true"),e.pdfLoadingTask){t.next=4;break}return t.abrupt("return",void 0);case 4:return n=e.pdfLoadingTask.destroy(),e.pdfLoadingTask=null,e.pdfDocument&&(e.pdfDocument=null,e.pdfThumbnailViewer.setDocument(null),e.pdfViewer.setDocument(null),e.pdfLinkService.setDocument(null),e.pdfDocumentProperties.setDocument(null)),Z(),e.store=null,e.isInitialViewSet=!1,e.downloadComplete=!1,e.url="",e.baseUrl="",e.contentDispositionFilename=null,e.pdfSidebar.reset(),e.pdfOutlineViewer.reset(),e.pdfAttachmentViewer.reset(),e.pdfHistory&&e.pdfHistory.reset(),e.findBar&&e.findBar.reset(),e.toolbar.reset(),e.secondaryToolbar.reset(),"undefined"!=typeof PDFBug&&PDFBug.cleanup(),t.abrupt("return",n);case 23:case"end":return t.stop()}},t)}))()},open:function(e,t){var n=this;return M(r.default.mark(function i(){var a,u,l,c,d,h,f,p,v;return r.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:if(!n.pdfLoadingTask){i.next=3;break}return i.next=3,n.close();case 3:for(u in a=o.AppOptions.getAll(o.OptionKind.WORKER))s.GlobalWorkerOptions[u]=a[u];for(d in l=Object.create(null),"string"==typeof e?(n.setTitleUsingUrl(e),l.url=e):e&&"byteLength"in e?l.data=e:e.url&&e.originalUrl&&(n.setTitleUsingUrl(e.originalUrl),l.url=e.url),c=o.AppOptions.getAll(o.OptionKind.API))h=c[d],l[d]=h;if(t)for(f in t)p=t[f],"length"===f&&n.pdfDocumentProperties.setFileSize(p),l[f]=p;return v=(0,s.getDocument)(l),n.pdfLoadingTask=v,v.onPassword=function(e,t){n.pdfLinkService.externalLinkEnabled=!1,n.passwordPrompt.setUpdateCallback(e,t),n.passwordPrompt.open()},v.onProgress=function(e){var t=e.loaded,i=e.total;n.progress(t/i)},v.onUnsupportedFeature=n.fallback.bind(n),i.abrupt("return",v.promise.then(function(e){n.load(e)},function(e){if(v===n.pdfLoadingTask){var t=e&&e.message;return(e instanceof s.InvalidPDFException?n.l10n.get("invalid_file_error",null,"Invalid or corrupted PDF file."):e instanceof s.MissingPDFException?n.l10n.get("missing_file_error",null,"Missing PDF file."):e instanceof s.UnexpectedResponseException?n.l10n.get("unexpected_response_error",null,"Unexpected server response."):n.l10n.get("loading_error",null,"An error occurred while loading the PDF.")).then(function(i){throw n.error(i,{message:t}),e})}}));case 16:case"end":return i.stop()}},i)}))()},download:function(){var e=this;function t(){r.downloadUrl(n,i)}var n=this.baseUrl,i=this.contentDispositionFilename||(0,a.getPDFFileNameFromURL)(this.url),r=this.downloadManager;r.onerror=function(t){e.error("PDF failed to download: ".concat(t))},this.pdfDocument&&this.downloadComplete?this.pdfDocument.getData().then(function(e){var t=new Blob([e],{type:"application/pdf"});r.download(t,n,i)}).catch(t):t()},fallback:function(e){this.fellback||(this.fellback=!0,this.externalServices.fallback({featureId:e,url:this.baseUrl},function(e){e&&U.download()}))},error:function(e,t){var n=[this.l10n.get("error_version_info",{version:s.version||"?",build:s.build||"?"},"PDF.js v{{version}} (build: {{build}})")];t&&(n.push(this.l10n.get("error_message",{message:t.message},"Message: {{message}}")),t.stack?n.push(this.l10n.get("error_stack",{stack:t.stack},"Stack: {{stack}}")):(t.filename&&n.push(this.l10n.get("error_file",{file:t.filename},"File: {{file}}")),t.lineNumber&&n.push(this.l10n.get("error_line",{line:t.lineNumber},"Line: {{line}}"))));var i=this.appConfig.errorWrapper,r=i.container;r.removeAttribute("hidden"),i.errorMessage.textContent=e;var o=i.closeButton;o.onclick=function(){r.setAttribute("hidden","true")};var u=i.errorMoreInfo,l=i.moreInfoButton,c=i.lessInfoButton;l.onclick=function(){u.removeAttribute("hidden"),l.setAttribute("hidden","true"),c.removeAttribute("hidden"),u.style.height=u.scrollHeight+"px"},c.onclick=function(){u.setAttribute("hidden","true"),l.removeAttribute("hidden"),c.setAttribute("hidden","true")},l.oncontextmenu=a.noContextMenuHandler,c.oncontextmenu=a.noContextMenuHandler,o.oncontextmenu=a.noContextMenuHandler,l.removeAttribute("hidden"),c.setAttribute("hidden","true"),Promise.all(n).then(function(e){u.value=e.join("\n")})},progress:function(e){var t=this;if(!this.downloadComplete){var n=Math.round(100*e);if(n>this.loadingBar.percent||isNaN(n))this.loadingBar.percent=n,(this.pdfDocument?this.pdfDocument.loadingParams.disableAutoFetch:o.AppOptions.get("disableAutoFetch"))&&n&&(this.disableAutoFetchLoadingBarTimeout&&(clearTimeout(this.disableAutoFetchLoadingBarTimeout),this.disableAutoFetchLoadingBarTimeout=null),this.loadingBar.show(),this.disableAutoFetchLoadingBarTimeout=setTimeout(function(){t.loadingBar.hide(),t.disableAutoFetchLoadingBarTimeout=null},5e3))}},load:function(e){var t=this;this.pdfDocument=e,e.getDownloadInfo().then(function(){t.downloadComplete=!0,t.loadingBar.hide(),l.then(function(){t.eventBus.dispatch("documentloaded",{source:t})})});var n=e.getPageLayout().catch(function(){}),i=e.getPageMode().catch(function(){}),s=e.getOpenAction().catch(function(){});this.toolbar.setPagesCount(e.numPages,!1),this.secondaryToolbar.setPagesCount(e.numPages),this.pdfLinkService.setDocument(e,null),this.pdfDocumentProperties.setDocument(e,this.url);var u=this.pdfViewer;u.setDocument(e);var l=u.firstPagePromise,d=u.onePageRendered,h=u.pagesPromise;this.pdfThumbnailViewer.setDocument(e);var f=(this.store=new L.ViewHistory(e.fingerprint)).getMultiple({page:null,zoom:a.DEFAULT_SCALE_VALUE,scrollLeft:"0",scrollTop:"0",rotation:null,sidebarView:c.SidebarView.UNKNOWN,scrollMode:a.ScrollMode.UNKNOWN,spreadMode:a.SpreadMode.UNKNOWN}).catch(function(){return Object.create(null)});l.then(function(l){t.loadingBar.setWidth(t.appConfig.viewerContainer),Promise.all([a.animationStarted,f,n,i,s]).then(function(){var n=M(r.default.mark(function n(i){var s,l,d,f,p,v,g,m,y,b,w,_,P;return r.default.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return s=x(i,5),s[0],l=s[1],d=s[2],f=s[3],p=s[4],v=o.AppOptions.get("viewOnLoad"),t._initializePdfHistory({fingerprint:e.fingerprint,viewOnLoad:v,initialDest:p&&p.dest}),g=t.initialBookmark,m=o.AppOptions.get("defaultZoomValue"),y=m?"zoom=".concat(m):null,b=null,w=o.AppOptions.get("sidebarViewOnLoad"),_=o.AppOptions.get("scrollModeOnLoad"),P=o.AppOptions.get("spreadModeOnLoad"),l.page&&v!==D&&(y="page=".concat(l.page,"&zoom=").concat(m||l.zoom,",")+"".concat(l.scrollLeft,",").concat(l.scrollTop),b=parseInt(l.rotation,10),w===c.SidebarView.UNKNOWN&&(w=0|l.sidebarView),_===a.ScrollMode.UNKNOWN&&(_=0|l.scrollMode),P===a.SpreadMode.UNKNOWN&&(P=0|l.spreadMode)),f&&w===c.SidebarView.UNKNOWN&&(w=De(f)),d&&P===a.SpreadMode.UNKNOWN&&(P=Re(d)),t.setInitialView(y,{rotation:b,sidebarView:w,scrollMode:_,spreadMode:P}),t.eventBus.dispatch("documentinit",{source:t}),t.isViewerEmbedded||u.focus(),t._initializePermissions(e),n.next=19,Promise.race([h,new Promise(function(e){setTimeout(e,1e4)})]);case 19:if(g||y){n.next=21;break}return n.abrupt("return");case 21:if(!u.hasEqualPageSizes){n.next=23;break}return n.abrupt("return");case 23:t.initialBookmark=g,u.currentScaleValue=u.currentScaleValue,t.setInitialView(y);case 26:case"end":return n.stop()}},n)}));return function(e){return n.apply(this,arguments)}}()).catch(function(){t.setInitialView()}).then(function(){u.update()})}),h.then(function(){t._initializeAutoPrint(e,s)}),d.then(function(){e.getOutline().then(function(e){t.pdfOutlineViewer.render({outline:e})}),e.getAttachments().then(function(e){t.pdfAttachmentViewer.render({attachments:e})})}),this._initializePageLabels(e),this._initializeMetadata(e)},_initializeAutoPrint:function(e,t){var n=this;return M(r.default.mark(function i(){var o,u,l,c,d,h,f,p;return r.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:return i.next=2,Promise.all([t,e.getJavaScript()]);case 2:if(o=i.sent,u=x(o,2),l=u[0],c=u[1],e===n.pdfDocument){i.next=8;break}return i.abrupt("return");case 8:if(d=!1,l&&"Print"===l.action&&(d=!0),!c){i.next=31;break}if(c.some(function(e){return!!e&&(console.warn("Warning: JavaScript is not supported"),n.fallback(s.UNSUPPORTED_FEATURES.javaScript),!0)}),d){i.next=31;break}h=C(c),i.prev=14,h.s();case 16:if((f=h.n()).done){i.next=23;break}if(!(p=f.value)||!a.AutoPrintRegExp.test(p)){i.next=21;break}return d=!0,i.abrupt("break",23);case 21:i.next=16;break;case 23:i.next=28;break;case 25:i.prev=25,i.t0=i.catch(14),h.e(i.t0);case 28:return i.prev=28,h.f(),i.finish(28);case 31:if(n.supportsPrinting){i.next=33;break}return i.abrupt("return");case 33:d&&setTimeout(function(){window.print()});case 34:case"end":return i.stop()}},i,null,[[14,25,28,31]])}))()},_initializeMetadata:function(e){var t=this;return M(r.default.mark(function n(){var i,a,o,u,l,c,d,h,f,p,v,g;return r.default.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,e.getMetadata();case 2:if(i=n.sent,a=i.info,o=i.metadata,u=i.contentDispositionFilename,e===t.pdfDocument){n.next=8;break}return n.abrupt("return");case 8:t.documentInfo=a,t.metadata=o,t.contentDispositionFilename=u,console.log("PDF ".concat(e.fingerprint," [").concat(a.PDFFormatVersion," ")+"".concat((a.Producer||"-").trim()," / ").concat((a.Creator||"-").trim(),"] ")+"(PDF.js: ".concat(s.version||"-")+"".concat(t.pdfViewer.enableWebGL?" [WebGL]":"",")")),(c=a&&a.Title)&&(l=c),(d=o&&o.get("dc:title"))&&("Untitled"===d||/[\uFFF0-\uFFFF]/g.test(d)||(l=d)),l?t.setTitle("".concat(l," - ").concat(u||document.title)):u&&t.setTitle(u),a.IsAcroFormPresent&&(console.warn("Warning: AcroForm/XFA is not supported"),t.fallback(s.UNSUPPORTED_FEATURES.forms)),h="other",["1.0","1.1","1.2","1.3","1.4","1.5","1.6","1.7","1.8","1.9","2.0","2.1","2.2","2.3"].includes(a.PDFFormatVersion)&&(h="v".concat(a.PDFFormatVersion.replace(".","_"))),f="other",p=["acrobat distiller","acrobat pdfwriter","adobe livecycle","adobe pdf library","adobe photoshop","ghostscript","tcpdf","cairo","dvipdfm","dvips","pdftex","pdfkit","itext","prince","quarkxpress","mac os x","microsoft","openoffice","oracle","luradocument","pdf-xchange","antenna house","aspose.cells","fpdf"],a.Producer&&(v=a.Producer.toLowerCase(),p.some(function(e){return!!v.includes(e)&&(f=e.replace(/[ .\-]/g,"_"),!0)})),g=null,a.IsAcroFormPresent&&(g=a.IsXFAPresent?"xfa":"acroform"),t.externalServices.reportTelemetry({type:"documentInfo",version:h,generator:f,formType:g});case 27:case"end":return n.stop()}},n)}))()},_initializePageLabels:function(e){var t=this;return M(r.default.mark(function n(){var i,a,s,u,l,c;return r.default.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,e.getPageLabels();case 2:if(i=n.sent,e===t.pdfDocument){n.next=5;break}return n.abrupt("return");case 5:if(i&&!o.AppOptions.get("disablePageLabels")){n.next=7;break}return n.abrupt("return");case 7:if((a=i.length)===t.pagesCount){n.next=11;break}return console.error("The number of Page Labels does not match the number of pages in the document."),n.abrupt("return");case 11:for(s=0;s1&&void 0!==arguments[1]?arguments[1]:{},o=r.rotation,s=r.sidebarView,u=r.scrollMode,l=r.spreadMode,c=function(e){(0,a.isValidRotation)(e)&&(i.pdfViewer.pagesRotation=e)};this.isInitialViewSet=!0,this.pdfSidebar.setInitialView(s),t=u,n=l,(0,a.isValidScrollMode)(t)&&(i.pdfViewer.scrollMode=t),(0,a.isValidSpreadMode)(n)&&(i.pdfViewer.spreadMode=n),this.initialBookmark?(c(this.initialRotation),delete this.initialRotation,this.pdfLinkService.setHash(this.initialBookmark),this.initialBookmark=null):e&&(c(o),this.pdfLinkService.setHash(e)),this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber,this.pdfViewer.currentPageLabel),this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber),this.pdfViewer.currentScaleValue||(this.pdfViewer.currentScaleValue=a.DEFAULT_SCALE_VALUE)},cleanup:function(){this.pdfDocument&&(this.pdfViewer.cleanup(),this.pdfThumbnailViewer.cleanup(),this.pdfViewer.renderer!==a.RendererType.SVG&&this.pdfDocument.cleanup())},forceRendering:function(){this.pdfRenderingQueue.printing=this.printing,this.pdfRenderingQueue.isThumbnailViewEnabled=this.pdfSidebar.isThumbnailViewVisible,this.pdfRenderingQueue.renderHighestPriority()},beforePrint:function(){var e=this;if(!this.printService)if(this.supportsPrinting)if(this.pdfViewer.pageViewsReady){var t=this.pdfViewer.getPagesOverview(),n=this.appConfig.printContainer,i=Ve.instance.createPrintService(this.pdfDocument,t,n,this.l10n);this.printService=i,this.forceRendering(),i.layout(),this.externalServices.reportTelemetry({type:"print"})}else this.l10n.get("printing_not_ready",null,"Warning: The PDF is not fully loaded for printing.").then(function(e){window.alert(e)});else this.l10n.get("printing_not_supported",null,"Warning: Printing is not fully supported by this browser.").then(function(t){e.error(t)})},afterPrint:function(){this.printService&&(this.printService.destroy(),this.printService=null),this.forceRendering()},rotatePages:function(e){if(this.pdfDocument){var t=(this.pdfViewer.pagesRotation+360+e)%360;this.pdfViewer.pagesRotation=t}},requestPresentationMode:function(){this.pdfPresentationMode&&this.pdfPresentationMode.request()},bindEvents:function(){var e=this.eventBus,t=this._boundEvents;t.beforePrint=this.beforePrint.bind(this),t.afterPrint=this.afterPrint.bind(this),e._on("resize",re),e._on("hashchange",ae),e._on("beforeprint",t.beforePrint),e._on("afterprint",t.afterPrint),e._on("pagerendered",X),e._on("updateviewarea",te),e._on("pagechanging",Ie),e._on("scalechanging",Ce),e._on("rotationchanging",xe),e._on("sidebarviewchanged",ee),e._on("pagemode",Y),e._on("namedaction",$),e._on("presentationmodechanged",J),e._on("presentationmode",oe),e._on("print",se),e._on("download",ue),e._on("firstpage",le),e._on("lastpage",ce),e._on("nextpage",de),e._on("previouspage",he),e._on("zoomin",fe),e._on("zoomout",pe),e._on("zoomreset",ve),e._on("pagenumberchanged",ge),e._on("scalechanged",me),e._on("rotatecw",ye),e._on("rotateccw",be),e._on("switchscrollmode",we),e._on("scrollmodechanged",ne),e._on("switchspreadmode",_e),e._on("spreadmodechanged",ie),e._on("documentproperties",Pe),e._on("find",Se),e._on("findfromurlhash",ke),e._on("updatefindmatchescount",Ee),e._on("updatefindcontrolstate",Le),e._on("fileinputchange",j),e._on("openfile",H)},bindWindowEvents:function(){var e=this.eventBus,t=this._boundEvents;t.windowResize=function(){e.dispatch("resize",{source:window})},t.windowHashChange=function(){e.dispatch("hashchange",{source:window,hash:document.location.hash.substring(1)})},t.windowBeforePrint=function(){e.dispatch("beforeprint",{source:window})},t.windowAfterPrint=function(){e.dispatch("afterprint",{source:window})},window.addEventListener("visibilitychange",Te),window.addEventListener("wheel",Be,{passive:!1}),window.addEventListener("click",Oe),window.addEventListener("keydown",Ae),window.addEventListener("resize",t.windowResize),window.addEventListener("hashchange",t.windowHashChange),window.addEventListener("beforeprint",t.windowBeforePrint),window.addEventListener("afterprint",t.windowAfterPrint)},unbindEvents:function(){var e=this.eventBus,t=this._boundEvents;e._off("resize",re),e._off("hashchange",ae),e._off("beforeprint",t.beforePrint),e._off("afterprint",t.afterPrint),e._off("pagerendered",X),e._off("updateviewarea",te),e._off("pagechanging",Ie),e._off("scalechanging",Ce),e._off("rotationchanging",xe),e._off("sidebarviewchanged",ee),e._off("pagemode",Y),e._off("namedaction",$),e._off("presentationmodechanged",J),e._off("presentationmode",oe),e._off("print",se),e._off("download",ue),e._off("firstpage",le),e._off("lastpage",ce),e._off("nextpage",de),e._off("previouspage",he),e._off("zoomin",fe),e._off("zoomout",pe),e._off("zoomreset",ve),e._off("pagenumberchanged",ge),e._off("scalechanged",me),e._off("rotatecw",ye),e._off("rotateccw",be),e._off("switchscrollmode",we),e._off("scrollmodechanged",ne),e._off("switchspreadmode",_e),e._off("spreadmodechanged",ie),e._off("documentproperties",Pe),e._off("find",Se),e._off("findfromurlhash",ke),e._off("updatefindmatchescount",Ee),e._off("updatefindcontrolstate",Le),e._off("fileinputchange",j),e._off("openfile",H),t.beforePrint=null,t.afterPrint=null},unbindWindowEvents:function(){var e=this._boundEvents;window.removeEventListener("visibilitychange",Te),window.removeEventListener("wheel",Be,{passive:!1}),window.removeEventListener("click",Oe),window.removeEventListener("keydown",Ae),window.removeEventListener("resize",e.windowResize),window.removeEventListener("hashchange",e.windowHashChange),window.removeEventListener("beforeprint",e.windowBeforePrint),window.removeEventListener("afterprint",e.windowAfterPrint),e.windowResize=null,e.windowHashChange=null,e.windowBeforePrint=null,e.windowAfterPrint=null}};t.PDFViewerApplication=U;var z,j,H,W=["null","http://mozilla.github.io","https://mozilla.github.io"];function q(){return G.apply(this,arguments)}function G(){return(G=M(r.default.mark(function e(){return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s.GlobalWorkerOptions.workerSrc||(s.GlobalWorkerOptions.workerSrc=o.AppOptions.get("workerSrc")),e.abrupt("return",(0,s.loadScript)(s.PDFWorker.getWorkerSrc()));case 2:case"end":return e.stop()}},e)}))).apply(this,arguments)}function K(e){var t=U.appConfig;return(0,s.loadScript)(t.debuggerScriptPath).then(function(){PDFBug.enable(e),PDFBug.init({OPS:s.OPS},t.mainContainer)})}function Q(){var e,t=U.appConfig,n=document.location.search.substring(1),i=(0,a.parseQueryString)(n);e="file"in i?i.file:o.AppOptions.get("defaultUrl"),F(e);var r=document.createElement("input");r.id=t.openFileInputName,r.className="fileInput",r.setAttribute("type","file"),r.oncontextmenu=a.noContextMenuHandler,document.body.appendChild(r),window.File&&window.FileReader&&window.FileList&&window.Blob?r.value=null:(t.toolbar.openFile.setAttribute("hidden","true"),t.secondaryToolbar.openFileButton.setAttribute("hidden","true")),r.addEventListener("change",function(e){var t=e.target.files;t&&0!==t.length&&U.eventBus.dispatch("fileinputchange",{source:this,fileInput:e.target})}),t.mainContainer.addEventListener("dragover",function(e){e.preventDefault(),e.dataTransfer.dropEffect="move"}),t.mainContainer.addEventListener("drop",function(e){e.preventDefault();var t=e.dataTransfer.files;t&&0!==t.length&&U.eventBus.dispatch("fileinputchange",{source:this,fileInput:e.dataTransfer})}),U.supportsDocumentFonts||(o.AppOptions.set("disableFontFace",!0),U.l10n.get("web_fonts_disabled",null,"Web fonts are disabled: unable to use embedded PDF fonts.").then(function(e){console.warn(e)})),U.supportsPrinting||(t.toolbar.print.classList.add("hidden"),t.secondaryToolbar.printButton.classList.add("hidden")),U.supportsFullscreen||(t.toolbar.presentationModeButton.classList.add("hidden"),t.secondaryToolbar.presentationModeButton.classList.add("hidden")),U.supportsIntegratedFind&&t.toolbar.viewFind.classList.add("hidden"),t.mainContainer.addEventListener("transitionend",function(e){e.target===this&&U.eventBus.dispatch("resize",{source:this})},!0);try{z(e)}catch(e){U.l10n.get("loading_error",null,"An error occurred while loading the PDF.").then(function(t){U.error(t,e)})}}function Z(){var e=U.appConfig;e&&e.viewerContainer.classList.remove(A)}function X(e){var t=e.pageNumber,n=t-1,i=U.pdfViewer.getPageView(n);if(t===U.page&&U.toolbar.updateLoadingIndicatorState(!1),i){if(U.pdfSidebar.isThumbnailViewVisible)U.pdfThumbnailViewer.getThumbnail(n).setImage(i);"undefined"!=typeof Stats&&Stats.enabled&&i.stats&&Stats.add(t,i.stats),i.error&&U.l10n.get("rendering_error",null,"An error occurred while rendering the page.").then(function(e){U.error(e,i.error)}),U.externalServices.reportTelemetry({type:"pageInfo",timestamp:e.timestamp}),U.pdfDocument.getStats().then(function(e){U.externalServices.reportTelemetry({type:"documentStats",stats:e})})}}function Y(e){var t,n=e.mode;switch(n){case"thumbs":t=c.SidebarView.THUMBS;break;case"bookmarks":case"outline":t=c.SidebarView.OUTLINE;break;case"attachments":t=c.SidebarView.ATTACHMENTS;break;case"none":t=c.SidebarView.NONE;break;default:return void console.error('Invalid "pagemode" hash parameter: '+n)}U.pdfSidebar.switchView(t,!0)}function $(e){switch(e.action){case"GoToPage":U.appConfig.toolbar.pageNumber.select();break;case"Find":U.supportsIntegratedFind||U.findBar.toggle()}}function J(e){var t=e.active,n=e.switchInProgress,i=a.PresentationModeState.NORMAL;n?i=a.PresentationModeState.CHANGING:t&&(i=a.PresentationModeState.FULLSCREEN),U.pdfViewer.presentationModeState=i}function ee(e){U.pdfRenderingQueue.isThumbnailViewEnabled=U.pdfSidebar.isThumbnailViewVisible;var t=U.store;t&&U.isInitialViewSet&&t.set("sidebarView",e.view).catch(function(){})}function te(e){var t=e.location,n=U.store;n&&U.isInitialViewSet&&n.setMultiple({page:t.pageNumber,zoom:t.scale,scrollLeft:t.left,scrollTop:t.top,rotation:t.rotation}).catch(function(){});var i=U.pdfLinkService.getAnchorUrl(t.pdfOpenParams);U.appConfig.toolbar.viewBookmark.href=i,U.appConfig.secondaryToolbar.viewBookmarkButton.href=i;var r=U.pdfViewer.getPageView(U.page-1).renderingState!==l.RenderingStates.FINISHED;U.toolbar.updateLoadingIndicatorState(r)}function ne(e){var t=U.store;t&&U.isInitialViewSet&&t.set("scrollMode",e.mode).catch(function(){})}function ie(e){var t=U.store;t&&U.isInitialViewSet&&t.set("spreadMode",e.mode).catch(function(){})}function re(){var e=U.pdfDocument,t=U.pdfViewer;if(e){var n=t.currentScaleValue;"auto"!==n&&"page-fit"!==n&&"page-width"!==n||(t.currentScaleValue=n),t.update()}}function ae(e){var t=e.hash;t&&(U.isInitialViewSet?U.pdfHistory.popStateInProgress||U.pdfLinkService.setHash(t):U.initialBookmark=t)}function oe(){U.requestPresentationMode()}function se(){window.print()}function ue(){U.download()}function le(){U.pdfDocument&&(U.page=1)}function ce(){U.pdfDocument&&(U.page=U.pagesCount)}function de(){U.page++}function he(){U.page--}function fe(){U.zoomIn()}function pe(){U.zoomOut()}function ve(){U.zoomReset()}function ge(e){var t=U.pdfViewer;""!==e.value&&(t.currentPageLabel=e.value),e.value!==t.currentPageNumber.toString()&&e.value!==t.currentPageLabel&&U.toolbar.setPageNumber(t.currentPageNumber,t.currentPageLabel)}function me(e){U.pdfViewer.currentScaleValue=e.value}function ye(){U.rotatePages(90)}function be(){U.rotatePages(-90)}function we(e){U.pdfViewer.scrollMode=e.mode}function _e(e){U.pdfViewer.spreadMode=e.mode}function Pe(){U.pdfDocumentProperties.open()}function Se(e){U.findController.executeCommand("find"+e.type,{query:e.query,phraseSearch:e.phraseSearch,caseSensitive:e.caseSensitive,entireWord:e.entireWord,highlightAll:e.highlightAll,findPrevious:e.findPrevious})}function ke(e){U.findController.executeCommand("find",{query:e.query,phraseSearch:e.phraseSearch,caseSensitive:!1,entireWord:!1,highlightAll:!0,findPrevious:!1})}function Ee(e){var t=e.matchesCount;U.supportsIntegratedFind?U.externalServices.updateFindMatchesCount(t):U.findBar.updateResultsCount(t)}function Le(e){var t=e.state,n=e.previous,i=e.matchesCount;U.supportsIntegratedFind?U.externalServices.updateFindControlState({result:t,findPrevious:n,matchesCount:i}):U.findBar.updateUIState(t,n,i)}function Ce(e){U.toolbar.setPageScale(e.presetValue,e.scale),U.pdfViewer.update()}function xe(e){U.pdfThumbnailViewer.pagesRotation=e.pagesRotation,U.forceRendering(),U.pdfViewer.currentPageNumber=e.pageNumber}function Ie(e){var t=e.pageNumber;if(U.toolbar.setPageNumber(t,e.pageLabel||null),U.secondaryToolbar.setPageNumber(t),U.pdfSidebar.isThumbnailViewVisible&&U.pdfThumbnailViewer.scrollThumbnailIntoView(t),"undefined"!=typeof Stats&&Stats.enabled){var n=U.pdfViewer.getPageView(t-1);n&&n.stats&&Stats.add(t,n.stats)}}function Te(e){"visible"===document.visibilityState&&Me()}F=function(e){if(void 0!==e)try{var t=new URL(window.location.href).origin||"null";if(W.includes(t))return;var n=new URL(e,window.location.href);n.origin,n.protocol}catch(e){var i=e&&e.message;throw U.l10n.get("loading_error",null,"An error occurred while loading the PDF.").then(function(e){U.error(e,{message:i})}),e}},z=function(e){if(e&&0===e.lastIndexOf("file:",0)){U.setTitleUsingUrl(e);var t=new XMLHttpRequest;return t.onload=function(){U.open(new Uint8Array(t.response))},t.open("GET",e),t.responseType="arraybuffer",void t.send()}e&&U.open(e)},j=function(e){if(!U.pdfViewer||!U.pdfViewer.isInPresentationMode){var t=e.fileInput.files[0];if(o.AppOptions.get("disableCreateObjectURL")){U.setTitleUsingUrl(t.name);var n=new FileReader;n.onload=function(e){var t=e.target.result;U.open(new Uint8Array(t))},n.readAsArrayBuffer(t)}else{var i=URL.createObjectURL(t);t.name&&(i={url:i,originalUrl:t.name}),U.open(i)}var r=U.appConfig;r.toolbar.viewBookmark.setAttribute("hidden","true"),r.secondaryToolbar.viewBookmarkButton.setAttribute("hidden","true"),r.toolbar.download.setAttribute("hidden","true"),r.secondaryToolbar.downloadButton.setAttribute("hidden","true")}},H=function(e){var t=U.appConfig.openFileInputName;document.getElementById(t).click()};var Ne=null;function Me(){Ne&&clearTimeout(Ne),Ne=setTimeout(function(){Ne=null},O)}function Be(e){var t=U.pdfViewer,n=U.supportedMouseWheelZoomModifierKeys;if(!t.isInPresentationMode)if(e.ctrlKey&&n.ctrlKey||e.metaKey&&n.metaKey){if(e.preventDefault(),Ne||"hidden"===document.visibilityState)return;var i=t.currentScale,r=3*(0,a.normalizeWheelEventDelta)(e);r<0?U.zoomOut(-r):U.zoomIn(r);var o=t.currentScale;if(i!==o){var s=o/i-1,u=t.container.getBoundingClientRect(),l=e.clientX-u.left,c=e.clientY-u.top;t.container.scrollLeft+=l*s,t.container.scrollTop+=c*s}}else Me()}function Oe(e){if(U.secondaryToolbar.isOpen){var t=U.appConfig;(U.pdfViewer.containsElement(e.target)||t.toolbar.container.contains(e.target)&&e.target!==t.secondaryToolbar.toggleButton)&&U.secondaryToolbar.close()}}function Ae(e){if(!U.overlayManager.active){var t=!1,n=!1,i=(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0),r=U.pdfViewer,a=r&&r.isInPresentationMode;if(1===i||8===i||5===i||12===i)switch(e.keyCode){case 70:U.supportsIntegratedFind||(U.findBar.open(),t=!0);break;case 71:if(!U.supportsIntegratedFind){var o=U.findController.state;o&&U.findController.executeCommand("findagain",{query:o.query,phraseSearch:o.phraseSearch,caseSensitive:o.caseSensitive,entireWord:o.entireWord,highlightAll:o.highlightAll,findPrevious:5===i||12===i}),t=!0}break;case 61:case 107:case 187:case 171:a||U.zoomIn(),t=!0;break;case 173:case 109:case 189:a||U.zoomOut(),t=!0;break;case 48:case 96:a||(setTimeout(function(){U.zoomReset()}),t=!1);break;case 38:(a||U.page>1)&&(U.page=1,t=!0,n=!0);break;case 40:(a||U.page1)&&(U.page=1,t=!0,n=!0);break;case 35:(a||U.page0?U.page1&&U.page--,t=!0)}if(4===i)switch(e.keyCode){case 13:case 32:if(!a&&"page-fit"!==r.currentScaleValue)break;U.page>1&&U.page--,t=!0;break;case 82:U.rotatePages(-90)}t||a||(e.keyCode>=33&&e.keyCode<=40||32===e.keyCode&&"BUTTON"!==c)&&(n=!0),n&&!r.containsElement(l)&&r.focus(),t&&e.preventDefault()}}}function Re(e){switch(e){case"SinglePage":case"OneColumn":return a.SpreadMode.NONE;case"TwoColumnLeft":case"TwoPageLeft":return a.SpreadMode.ODD;case"TwoColumnRight":case"TwoPageRight":return a.SpreadMode.EVEN}return a.SpreadMode.NONE}function De(e){switch(e){case"UseNone":return c.SidebarView.NONE;case"UseThumbs":return c.SidebarView.THUMBS;case"UseOutlines":return c.SidebarView.OUTLINE;case"UseAttachments":return c.SidebarView.ATTACHMENTS}return c.SidebarView.NONE}var Ve={instance:{supportsPrinting:!1,createPrintService:function(){throw new Error("Not implemented: createPrintService")}}};t.PDFPrintServiceFactory=Ve},function(e,t,n){"use strict";e.exports=n(3)},function(e,t,n){"use strict";(function(e){function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var n=function(e){var n,i=Object.prototype,r=i.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function l(e,t,n,i){var r=t&&t.prototype instanceof g?t:g,a=Object.create(r.prototype),o=new x(i||[]);return a._invoke=function(e,t,n){var i=d;return function(r,a){if(i===f)throw new Error("Generator is already running");if(i===p){if("throw"===r)throw a;return T()}for(n.method=r,n.arg=a;;){var o=n.delegate;if(o){var s=E(o,n);if(s){if(s===v)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===d)throw i=p,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=f;var u=c(e,t,n);if("normal"===u.type){if(i=n.done?p:h,u.arg===v)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(i=p,n.method="throw",n.arg=u.arg)}}}(e,n,o),a}function c(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=l;var d="suspendedStart",h="suspendedYield",f="executing",p="completed",v={};function g(){}function m(){}function y(){}var b={};b[o]=function(){return this};var w=Object.getPrototypeOf,_=w&&w(w(I([])));_&&_!==i&&r.call(_,o)&&(b=_);var P=y.prototype=g.prototype=Object.create(b);function S(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function k(e,n){var i;this._invoke=function(a,o){function s(){return new n(function(i,s){!function i(a,o,s,u){var l=c(e[a],e,o);if("throw"!==l.type){var d=l.arg,h=d.value;return h&&"object"===t(h)&&r.call(h,"__await")?n.resolve(h.__await).then(function(e){i("next",e,s,u)},function(e){i("throw",e,s,u)}):n.resolve(h).then(function(e){d.value=e,s(d)},function(e){return i("throw",e,s,u)})}u(l.arg)}(a,o,i,s)})}return i=i?i.then(s,s):s()}}function E(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,E(e,t),"throw"===t.method))return v;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var r=c(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,v;var a=r.arg;return a?a.done?(t[e.resultName]=a.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,v):a:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,v)}function L(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function C(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function x(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(L,this),this.reset(!0)}function I(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,a=function t(){for(;++i=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return i("end");if(o.tryLoc<=this.prev){var u=r.call(o,"catchLoc"),l=r.call(o,"finallyLoc");if(u&&l){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),C(n),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;C(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:I(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),v}},e}("object"===t(e)?e.exports:{});try{regeneratorRuntime=n}catch(e){Function("r","regeneratorRuntime = r")(n)}}).call(this,n(4)(e))},function(e,t,n){"use strict";e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isValidRotation=function(e){return Number.isInteger(e)&&e%90==0},t.isValidScrollMode=function(e){return Number.isInteger(e)&&Object.values(h).includes(e)&&e!==h.UNKNOWN},t.isValidSpreadMode=function(e){return Number.isInteger(e)&&Object.values(f).includes(e)&&e!==f.UNKNOWN},t.isPortraitOrientation=function(e){return e.width<=e.height},t.clamp=_,t.getPDFFileNameFromURL=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"document.pdf";if("string"!=typeof e)return t;if(function(e){var t=0,n=e.length;for(;t1?a[1]:null;n[decodeURIComponent(o)]=decodeURIComponent(s)}return n},t.backtrackBeforeAllVisibleElements=m,t.getVisibleElements=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=e.scrollTop,a=r+e.clientHeight,o=e.scrollLeft,s=o+e.clientWidth;var u=[],l=t.length,c=0===l?0:g(t,i?function(e){var t=e.div;return t.offsetLeft+t.clientLeft+t.clientWidth>o}:function(e){var t=e.div;return t.offsetTop+t.clientTop+t.clientHeight>r});c>0&&c=a&&(d=P);else if((i?v:y)>d)break;if(!(P<=r||y>=a||_<=o||v>=s)){var S=Math.max(0,r-y)+Math.max(0,P-a),k=Math.max(0,o-v)+Math.max(0,_-s),E=(w-S)*(b-k)*100/w/b|0;u.push({id:f.id,x:v,y:y,view:f,percent:E})}}var L=u[0],C=u[u.length-1];n&&u.sort(function(e,t){var n=e.percent-t.percent;return Math.abs(n)>.001?-n:e.id-t.id});return{first:L,last:C,views:u}},t.roundToDivide=function(e,t){var n=e%t;return 0===n?e:Math.round(e-n+t)},t.getPageSizeInches=function(e){var t=e.view,n=e.userUnit,i=e.rotate,r=(f=t,p=4,function(e){if(Array.isArray(e))return e}(f)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],i=!0,r=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,a=e}finally{try{i||null==s.return||s.return()}finally{if(r)throw a}}return n}}(f,p)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(f,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=r[0],o=r[1],s=r[2],u=r[3],c=i%180!=0,d=(s-a)/72*n,h=(u-o)/72*n;var f,p;return{width:c?h:d,height:c?d:h}},t.approximateFraction=function(e){if(Math.floor(e)===e)return[e,1];var t=1/e;if(t>8)return[1,8];if(Math.floor(t)===t)return[1,t];var n,i=e>1?t:e,r=0,a=1,o=1,s=1;for(;;){var u=r+o,l=a+s;if(l>8)break;i<=u/l?(o=u,s=l):(r=u,a=l)}n=i-r/a2&&void 0!==arguments[2]&&arguments[2],i=e.offsetParent;if(!i)return void console.error("offsetParent is not set -- cannot scroll");var r=e.offsetTop+e.clientTop,a=e.offsetLeft+e.clientLeft;for(;i.clientHeight===i.scrollHeight&&i.clientWidth===i.scrollWidth||n&&"hidden"===getComputedStyle(i).overflow;)if(i.dataset._scaleY&&(r/=i.dataset._scaleY,a/=i.dataset._scaleX),r+=i.offsetTop,a+=i.offsetLeft,!(i=i.offsetParent))return;t&&(void 0!==t.top&&(r+=t.top),void 0!==t.left&&(a+=t.left,i.scrollLeft=a));i.scrollTop=r},t.watchScroll=function(e,t){var n=function(n){r||(r=window.requestAnimationFrame(function(){r=null;var n=e.scrollLeft,a=i.lastX;n!==a&&(i.right=n>a),i.lastX=n;var o=e.scrollTop,s=i.lastY;o!==s&&(i.down=o>s),i.lastY=o,t(i)}))},i={right:!0,down:!0,lastX:e.scrollLeft,lastY:e.scrollTop,_eventHandler:n},r=null;return e.addEventListener("scroll",n,!0),i},t.binarySearchFirstItem=g,t.normalizeWheelEventDelta=function(e){var t=Math.sqrt(e.deltaX*e.deltaX+e.deltaY*e.deltaY),n=Math.atan2(e.deltaY,e.deltaX);-.25*Math.PI=0))throw new Error("waitOnEventOrTimeout - invalid parameters.");function a(i){t instanceof w?t._off(n,o):t.removeEventListener(n,o),l&&clearTimeout(l),e(i)}var o=a.bind(null,y.EVENT);t instanceof w?t._on(n,o):t.addEventListener(n,o);var s=a.bind(null,y.TIMEOUT),l=setTimeout(s,r)})},t.moveToEndOfArray=function(e,t){for(var n=[],i=e.length,r=0,a=0;ae.length)&&(t=e.length);for(var n=0,i=new Array(t);n>1;t(e[r])?i=r:n=r+1}return n}function m(e,t,n){if(e<2)return e;var i=t[e].div,r=i.offsetTop+i.clientTop;r>=n&&(r=(i=t[e-1].div).offsetTop+i.clientTop);for(var a=e-2;a>=0&&!((i=t[a].div).offsetTop+i.clientTop+i.clientHeight<=r);--a)e=a;return e}t.NullL10n=v;var y={EVENT:"event",TIMEOUT:"timeout"};t.WaitOnType=y;var b=new Promise(function(e){window.requestAnimationFrame(e)});t.animationStarted=b;var w=function(){function e(t){a(this,e),this._listeners=Object.create(null)}return s(e,[{key:"on",value:function(e,t){this._on(e,t,{external:!0})}},{key:"off",value:function(e,t){this._off(e,t,{external:!0})}},{key:"dispatch",value:function(e){var t=this._listeners[e];if(t&&0!==t.length){var n,i=Array.prototype.slice.call(arguments,1);t.slice(0).forEach(function(e){var t=e.listener;if(e.external)return n||(n=[]),void n.push(t);t.apply(null,i)}),n&&(n.forEach(function(e){e.apply(null,i)}),n=null)}}},{key:"_on",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=this._listeners[e];i||(this._listeners[e]=i=[]),i.push({listener:t,external:!0===(n&&n.external)})}},{key:"_off",value:function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];var n=this._listeners[e];if(n)for(var i=0,r=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.height,r=n.width,o=n.units;a(this,e),this.visible=!0,this.div=document.querySelector(t+" .progress"),this.bar=this.div.parentNode,this.height=i||100,this.width=r||100,this.units=o||"%",this.div.style.height=this.height+this.units,this.percent=0}return s(e,[{key:"_updateBar",value:function(){if(this._indeterminate)return this.div.classList.add("indeterminate"),void(this.div.style.width=this.width+this.units);this.div.classList.remove("indeterminate");var e=this.width*this._percent/100;this.div.style.width=e+this.units}},{key:"setWidth",value:function(e){if(e){var t=e.parentNode.offsetWidth-e.offsetWidth;t>0&&(this.bar.style.width="calc(100% - ".concat(t,"px)"))}}},{key:"hide",value:function(){this.visible&&(this.visible=!1,this.bar.classList.add("hidden"),document.body.classList.remove("loadingInProgress"))}},{key:"show",value:function(){this.visible||(this.visible=!0,document.body.classList.add("loadingInProgress"),this.bar.classList.remove("hidden"))}},{key:"percent",get:function(){return this._percent},set:function(e){this._indeterminate=isNaN(e),this._percent=_(e,0,100),this._updateBar()}}]),e}();t.ProgressBar=P},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OptionKind=t.AppOptions=void 0;var i=n(7);function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:null,t=Object.create(null);for(var n in s){var i=s[n];if(e){if(0==(e&i.kind))continue;if(e===o.PREFERENCE){var a=i.value,l=r(a);if("boolean"===l||"string"===l||"number"===l&&Number.isInteger(a)){t[n]=a;continue}throw new Error("Invalid type for preference: ".concat(n))}}var c=u[n];t[n]=void 0!==c?c:i.compatibility||i.value}return t}},{key:"set",value:function(e,t){u[e]=t}},{key:"remove",value:function(e){delete u[e]}}],(n=null)&&a(t.prototype,n),i&&a(t,i),e}();t.AppOptions=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.viewerCompatibilityParams=void 0;var i=Object.create(null),r="undefined"!=typeof navigator&&navigator.userAgent||"",a="undefined"!=typeof navigator&&navigator.platform||"",o="undefined"!=typeof navigator&&navigator.maxTouchPoints||1,s=/Android/.test(r),u=/Trident/.test(r),l=/\b(iPad|iPhone|iPod)(?=;)/.test(r)||"MacIntel"===a&&o>1,c=/CriOS/.test(r);(u||c)&&(i.disableCreateObjectURL=!0),(l||s)&&(i.maxCanvasPixels=5242880);var d=Object.freeze(i);t.viewerCompatibilityParams=d},function(e,t,n){"use strict";var i;i="undefined"!=typeof window&&window["pdfjs-dist/build/pdf"]?window["pdfjs-dist/build/pdf"]:require("../build/pdf.js"),e.exports=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFCursorTools=t.CursorTool=void 0;var i=n(10);function r(e,t){for(var n=0;n9,o=window.chrome,s=o&&(o.webstore||o.app),u=/Apple/.test(navigator.vendor)&&/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent)},function(e,t,n){"use strict";function i(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:o.NONE;this.isInitialViewSet||(this.isInitialViewSet=!0,e!==o.NONE&&e!==o.UNKNOWN&&this._switchView(e,!0)||this._dispatchEvent())}},{key:"switchView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this._switchView(e,t)}},{key:"_switchView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e!==this.active,i=!1;switch(e){case o.NONE:return!!this.isOpen&&(this.close(),!0);case o.THUMBS:this.isOpen&&n&&(i=!0);break;case o.OUTLINE:if(this.outlineButton.disabled)return!1;break;case o.ATTACHMENTS:if(this.attachmentsButton.disabled)return!1;break;default:return console.error('PDFSidebar._switchView: "'.concat(e,'" is not a valid view.')),!1}return this.active=e,this.thumbnailButton.classList.toggle("toggled",e===o.THUMBS),this.outlineButton.classList.toggle("toggled",e===o.OUTLINE),this.attachmentsButton.classList.toggle("toggled",e===o.ATTACHMENTS),this.thumbnailView.classList.toggle("hidden",e!==o.THUMBS),this.outlineView.classList.toggle("hidden",e!==o.OUTLINE),this.attachmentsView.classList.toggle("hidden",e!==o.ATTACHMENTS),t&&!this.isOpen?(this.open(),!0):(i&&(this._updateThumbnailViewer(),this._forceRendering()),n&&this._dispatchEvent(),this._hideUINotification(this.active),n)}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,this.toggleButton.classList.add("toggled"),this.outerContainer.classList.add("sidebarMoving","sidebarOpen"),this.active===o.THUMBS&&this._updateThumbnailViewer(),this._forceRendering(),this._dispatchEvent(),this._hideUINotification(this.active))}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.toggleButton.classList.remove("toggled"),this.outerContainer.classList.add("sidebarMoving"),this.outerContainer.classList.remove("sidebarOpen"),this._forceRendering(),this._dispatchEvent())}},{key:"toggle",value:function(){this.isOpen?this.close():this.open()}},{key:"_dispatchEvent",value:function(){this.eventBus.dispatch("sidebarviewchanged",{source:this,view:this.visibleView})}},{key:"_forceRendering",value:function(){this.onToggled?this.onToggled():(this.pdfViewer.forceRendering(),this.pdfThumbnailViewer.forceRendering())}},{key:"_updateThumbnailViewer",value:function(){for(var e=this.pdfViewer,t=this.pdfThumbnailViewer,n=e.pagesCount,i=0;i2&&void 0!==s[2]?s[2]:null,a=s.length>3&&void 0!==s[3]&&s[3],t&&n&&(o=n.parentNode)){e.next=6;break}throw new Error("Not enough parameters.");case 6:if(!this._overlays[t]){e.next=8;break}throw new Error("The overlay is already registered.");case 8:this._overlays[t]={element:n,container:o,callerCloseMethod:i,canForceClose:a};case 9:case"end":return e.stop()}},e,this)}));return function(t,n){return e.apply(this,arguments)}}()},{key:"unregister",value:function(){var e=o(r.default.mark(function e(t){return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this._overlays[t]){e.next=4;break}throw new Error("The overlay does not exist.");case 4:if(this._active!==t){e.next=6;break}throw new Error("The overlay cannot be removed while it is active.");case 6:delete this._overlays[t];case 7:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"open",value:function(){var e=o(r.default.mark(function e(t){return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this._overlays[t]){e.next=4;break}throw new Error("The overlay does not exist.");case 4:if(!this._active){e.next=14;break}if(!this._overlays[t].canForceClose){e.next=9;break}this._closeThroughCaller(),e.next=14;break;case 9:if(this._active!==t){e.next=13;break}throw new Error("The overlay is already active.");case 13:throw new Error("Another overlay is currently active.");case 14:this._active=t,this._overlays[this._active].element.classList.remove("hidden"),this._overlays[this._active].container.classList.remove("hidden"),window.addEventListener("keydown",this._keyDownBound);case 18:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"close",value:function(){var e=o(r.default.mark(function e(t){return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(this._overlays[t]){e.next=4;break}throw new Error("The overlay does not exist.");case 4:if(this._active){e.next=8;break}throw new Error("The overlay is currently not active.");case 8:if(this._active===t){e.next=10;break}throw new Error("Another overlay is currently active.");case 10:this._overlays[this._active].container.classList.add("hidden"),this._overlays[this._active].element.classList.add("hidden"),this._active=null,window.removeEventListener("keydown",this._keyDownBound);case 14:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"_keyDown",value:function(e){this._active&&27===e.keyCode&&(this._closeThroughCaller(),e.preventDefault())}},{key:"_closeThroughCaller",value:function(){this._overlays[this._active].callerCloseMethod&&this._overlays[this._active].callerCloseMethod(),this._active&&this.close(this._active)}},{key:"active",get:function(){return this._active}}])&&s(t.prototype,n),i&&s(t,i),e}();t.OverlayManager=u},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PasswordPrompt=void 0;var i=n(5),r=n(8);function a(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:i.NullL10n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.overlayName=t.overlayName,this.container=t.container,this.label=t.label,this.input=t.input,this.submitButton=t.submitButton,this.cancelButton=t.cancelButton,this.overlayManager=n,this.l10n=a,this.updateCallback=null,this.reason=null,this.submitButton.addEventListener("click",this.verify.bind(this)),this.cancelButton.addEventListener("click",this.close.bind(this)),this.input.addEventListener("keydown",function(e){13===e.keyCode&&r.verify()}),this.overlayManager.register(this.overlayName,this.container,this.close.bind(this),!0)}var t,n,o;return t=e,(n=[{key:"open",value:function(){var e=this;this.overlayManager.open(this.overlayName).then(function(){e.input.focus(),(e.reason===r.PasswordResponses.INCORRECT_PASSWORD?e.l10n.get("password_invalid",null,"Invalid password. Please try again."):e.l10n.get("password_label",null,"Enter the password to open this PDF file.")).then(function(t){e.label.textContent=t})})}},{key:"close",value:function(){var e=this;this.overlayManager.close(this.overlayName).then(function(){e.input.value=""})}},{key:"verify",value:function(){var e=this.input.value;e&&e.length>0&&(this.close(),this.updateCallback(e))}},{key:"setUpdateCallback",value:function(e,t){this.updateCallback=e,this.reason=t}}])&&a(t.prototype,n),o&&a(t,o),e}();t.PasswordPrompt=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFAttachmentViewer=void 0;var i=n(8);function r(e,t){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];this.attachments=null,this.container.textContent="",e||(this._renderedCapability=(0,i.createPromiseCapability)())}},{key:"_dispatchEvent",value:function(e){this._renderedCapability.resolve(),this.eventBus.dispatch("attachmentsloaded",{source:this,attachmentsCount:e})}},{key:"_bindPdfLink",value:function(e,t,n){var i,r=this;e.onclick=function(){var e;i||(i=URL.createObjectURL(new Blob([t],{type:"application/pdf"}))),e="?file="+encodeURIComponent(i+"#"+n);try{window.open(e)}catch(e){console.error("_bindPdfLink: ".concat(e)),URL.revokeObjectURL(i),i=null,r.downloadManager.downloadData(t,n,"application/pdf")}return!1}}},{key:"_bindLink",value:function(e,t,n){var i=this;e.onclick=function(){return i.downloadManager.downloadData(t,n,""),!1}}},{key:"render",value:function(e){var t=e.attachments,n=e.keepRenderedCapability,r=void 0!==n&&n,a=0;if(this.attachments&&this.reset(!0===r),this.attachments=t||null,t){var o=Object.keys(t).sort(function(e,t){return e.toLowerCase().localeCompare(t.toLowerCase())});a=o.length;for(var s=0;se.length)&&(t=e.length);for(var n=0,i=new Array(t);n3&&void 0!==arguments[3]?arguments[3]:o.NullL10n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.overlayName=a,this.fields=s,this.container=u,this.overlayManager=n,this.l10n=c,this._reset(),l.addEventListener("click",this.close.bind(this)),this.overlayManager.register(this.overlayName,this.container,this.close.bind(this)),i._on("pagechanging",function(e){r._currentPageNumber=e.pageNumber}),i._on("rotationchanging",function(e){r._pagesRotation=e.pagesRotation}),this._isNonMetricLocale=!0,c.getLanguage().then(function(e){r._isNonMetricLocale=h.includes(e)})}var t,n,i;return t=e,(n=[{key:"open",value:function(){var e=this,t=function(t){Object.defineProperty(e,"fieldData",{value:Object.freeze(t),writable:!1,enumerable:!0,configurable:!0})};Promise.all([this.overlayManager.open(this.overlayName),this._dataAvailableCapability.promise]).then(function(){var n=e._currentPageNumber,i=e._pagesRotation;e.fieldData&&n===e.fieldData._currentPageNumber&&i===e.fieldData._pagesRotation?e._updateUI():e.pdfDocument.getMetadata().then(function(t){var r=t.info,a=t.metadata,s=t.contentDispositionFilename;return Promise.all([r,a,s||(0,o.getPDFFileNameFromURL)(e.url),e._parseFileSize(e.maybeFileSize),e._parseDate(r.CreationDate),e._parseDate(r.ModDate),e.pdfDocument.getPage(n).then(function(t){return e._parsePageSize((0,o.getPageSizeInches)(t),i)}),e._parseLinearization(r.IsLinearized)])}).then(function(r){var a=l(r,8),o=a[0],s=(a[1],a[2]),u=a[3],c=a[4],d=a[5],h=a[6],f=a[7];return t({fileName:s,fileSize:u,title:o.Title,author:o.Author,subject:o.Subject,keywords:o.Keywords,creationDate:c,modificationDate:d,creator:o.Creator,producer:o.Producer,version:o.PDFFormatVersion,pageCount:e.pdfDocument.numPages,pageSize:h,linearized:f,_currentPageNumber:n,_pagesRotation:i}),e._updateUI(),e.pdfDocument.getDownloadInfo()}).then(function(t){var n=t.length;return e.maybeFileSize=n,e._parseFileSize(n)}).then(function(n){if(n!==e.fieldData.fileSize){var i=Object.assign(Object.create(null),e.fieldData);i.fileSize=n,t(i),e._updateUI()}})})}},{key:"close",value:function(){this.overlayManager.close(this.overlayName)}},{key:"setDocument",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.pdfDocument&&(this._reset(),this._updateUI(!0)),e&&(this.pdfDocument=e,this.url=t,this._dataAvailableCapability.resolve())}},{key:"setFileSize",value:function(e){Number.isInteger(e)&&e>0&&(this.maybeFileSize=e)}},{key:"_reset",value:function(){this.pdfDocument=null,this.url=null,this.maybeFileSize=0,delete this.fieldData,this._dataAvailableCapability=(0,a.createPromiseCapability)(),this._currentPageNumber=1,this._pagesRotation=0}},{key:"_updateUI",value:function(){if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0])&&this.fieldData){if(this.overlayManager.active===this.overlayName)for(var e in this.fields){var t=this.fieldData[e];this.fields[e].textContent=t||0===t?t:"-"}}else for(var n in this.fields)this.fields[n].textContent="-"}},{key:"_parseFileSize",value:function(){var e=u(r.default.mark(function e(){var t,n,i=arguments;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=i.length>0&&void 0!==i[0]?i[0]:0,n=t/1024){e.next=6;break}return e.abrupt("return",void 0);case 6:if(!(n<1024)){e.next=8;break}return e.abrupt("return",this.l10n.get("document_properties_kb",{size_kb:(+n.toPrecision(3)).toLocaleString(),size_b:t.toLocaleString()},"{{size_kb}} KB ({{size_b}} bytes)"));case 8:return e.abrupt("return",this.l10n.get("document_properties_mb",{size_mb:(+(n/1024).toPrecision(3)).toLocaleString(),size_b:t.toLocaleString()},"{{size_mb}} MB ({{size_b}} bytes)"));case 9:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()},{key:"_parsePageSize",value:function(){var e=u(r.default.mark(function e(t,n){var i,a,s,u,c,d,h,g=this;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",void 0);case 2:return n%180!=0&&(t={width:t.height,height:t.width}),i=(0,o.isPortraitOrientation)(t),a={width:Math.round(100*t.width)/100,height:Math.round(100*t.height)/100},s={width:Math.round(25.4*t.width*10)/10,height:Math.round(25.4*t.height*10)/10},u=null,(c=v(a,i,f)||v(s,i,p))||Number.isInteger(s.width)&&Number.isInteger(s.height)||(d={width:25.4*t.width,height:25.4*t.height},h={width:Math.round(s.width),height:Math.round(s.height)},Math.abs(d.width-h.width)<.1&&Math.abs(d.height-h.height)<.1&&(c=v(h,i,p))&&(a={width:Math.round(h.width/25.4*100)/100,height:Math.round(h.height/25.4*100)/100},s=h)),c&&(u=this.l10n.get("document_properties_page_size_name_"+c.toLowerCase(),null,c)),e.abrupt("return",Promise.all([this._isNonMetricLocale?a:s,this.l10n.get("document_properties_page_size_unit_"+(this._isNonMetricLocale?"inches":"millimeters"),null,this._isNonMetricLocale?"in":"mm"),u,this.l10n.get("document_properties_page_size_orientation_"+(i?"portrait":"landscape"),null,i?"portrait":"landscape")]).then(function(e){var t=l(e,4),n=t[0],i=n.width,r=n.height,a=t[1],o=t[2],s=t[3];return g.l10n.get("document_properties_page_size_dimension_"+(o?"name_":"")+"string",{width:i.toLocaleString(),height:r.toLocaleString(),unit:a,name:o,orientation:s},"{{width}} × {{height}} {{unit}} ("+(o?"{{name}}, ":"")+"{{orientation}})")}));case 11:case"end":return e.stop()}},e,this)}));return function(t,n){return e.apply(this,arguments)}}()},{key:"_parseDate",value:function(){var e=u(r.default.mark(function e(t){var n;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=a.PDFDateString.toDateObject(t)){e.next=3;break}return e.abrupt("return",void 0);case 3:return e.abrupt("return",this.l10n.get("document_properties_date_string",{date:n.toLocaleDateString(),time:n.toLocaleTimeString()},"{{date}}, {{time}}"));case 4:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()},{key:"_parseLinearization",value:function(e){return this.l10n.get("document_properties_linearized_"+(e?"yes":"no"),null,e?"Yes":"No")}}])&&d(t.prototype,n),i&&d(t,i),e}();t.PDFDocumentProperties=g},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFFindBar=void 0;var i=n(18),r=n(5);function a(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:r.NullL10n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.opened=!1,this.bar=t.bar||null,this.toggleButton=t.toggleButton||null,this.findField=t.findField||null,this.highlightAll=t.highlightAllCheckbox||null,this.caseSensitive=t.caseSensitiveCheckbox||null,this.entireWord=t.entireWordCheckbox||null,this.findMsg=t.findMsg||null,this.findResultsCount=t.findResultsCount||null,this.findPreviousButton=t.findPreviousButton||null,this.findNextButton=t.findNextButton||null,this.eventBus=n,this.l10n=a,this.toggleButton.addEventListener("click",function(){i.toggle()}),this.findField.addEventListener("input",function(){i.dispatchEvent("")}),this.bar.addEventListener("keydown",function(e){switch(e.keyCode){case 13:e.target===i.findField&&i.dispatchEvent("again",e.shiftKey);break;case 27:i.close()}}),this.findPreviousButton.addEventListener("click",function(){i.dispatchEvent("again",!0)}),this.findNextButton.addEventListener("click",function(){i.dispatchEvent("again",!1)}),this.highlightAll.addEventListener("click",function(){i.dispatchEvent("highlightallchange")}),this.caseSensitive.addEventListener("click",function(){i.dispatchEvent("casesensitivitychange")}),this.entireWord.addEventListener("click",function(){i.dispatchEvent("entirewordchange")}),this.eventBus._on("resize",this._adjustWidth.bind(this))}var t,n,o;return t=e,(n=[{key:"reset",value:function(){this.updateUIState()}},{key:"dispatchEvent",value:function(e,t){this.eventBus.dispatch("find",{source:this,type:e,query:this.findField.value,phraseSearch:!0,caseSensitive:this.caseSensitive.checked,entireWord:this.entireWord.checked,highlightAll:this.highlightAll.checked,findPrevious:t})}},{key:"updateUIState",value:function(e,t,n){var r=this,a=!1,o="",s="";switch(e){case i.FindState.FOUND:break;case i.FindState.PENDING:s="pending";break;case i.FindState.NOT_FOUND:o=this.l10n.get("find_not_found",null,"Phrase not found"),a=!0;break;case i.FindState.WRAPPED:o=t?this.l10n.get("find_reached_top",null,"Reached top of document, continued from bottom"):this.l10n.get("find_reached_bottom",null,"Reached end of document, continued from top")}this.findField.classList.toggle("notFound",a),this.findField.setAttribute("data-status",s),Promise.resolve(o).then(function(e){r.findMsg.textContent=e,r._adjustWidth()}),this.updateResultsCount(n)}},{key:"updateResultsCount",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.current,i=void 0===n?0:n,r=t.total,a=void 0===r?0:r;if(this.findResultsCount){var o="";a>0&&(o=a>1e3?this.l10n.get("find_match_count_limit",{limit:1e3},"More than {{limit}} matches"):this.l10n.get("find_match_count",{current:i,total:a},"{{current}} of {{total}} match"+(1!==a?"es":""))),Promise.resolve(o).then(function(t){e.findResultsCount.textContent=t,e.findResultsCount.classList.toggle("hidden",!a),e._adjustWidth()})}}},{key:"open",value:function(){this.opened||(this.opened=!0,this.toggleButton.classList.add("toggled"),this.bar.classList.remove("hidden")),this.findField.select(),this.findField.focus(),this._adjustWidth()}},{key:"close",value:function(){this.opened&&(this.opened=!1,this.toggleButton.classList.remove("toggled"),this.bar.classList.add("hidden"),this.eventBus.dispatch("findbarclose",{source:this}))}},{key:"toggle",value:function(){this.opened?this.close():this.open()}},{key:"_adjustWidth",value:function(){this.opened&&(this.bar.classList.remove("wrapContainers"),this.bar.clientHeight>this.bar.firstElementChild.clientHeight&&this.bar.classList.add("wrapContainers"))}}])&&a(t.prototype,n),o&&a(t,o),e}();t.PDFFindBar=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFFindController=t.FindState=void 0;var i=n(8),r=n(19),a=n(5);function o(e,t){for(var n=0;n=1&&n<=i.pagesCount&&n!==i.page&&!i.isPageVisible(n);case"findhighlightallchange":return!1}return!0}},{key:"_prepareMatches",value:function(e,t,n){function i(t){var n=e[t],i=e[t+1];if(t=0;r--){var a=e[r];if(!a.skipped){if(a.match+a.matchLength=n.match+n.matchLength)return n.skipped=!0,!0}}return!1}e.sort(function(e,t){return e.match===t.match?e.matchLength-t.matchLength:e.match-t.match});for(var r=0,a=e.length;r0){var i=e.charCodeAt(t),a=e.charCodeAt(t-1);if((0,r.getCharacterType)(i)===(0,r.getCharacterType)(a))return!1}var o=t+n-1;if(o0&&(this._matchesCountTotal+=s,this._updateUIResultsCount())}}},{key:"_extractText",value:function(){var e=this;if(!(this._extractTextPromises.length>0))for(var t=Promise.resolve(),n=function(n,r){var a=(0,i.createPromiseCapability)();e._extractTextPromises[n]=a.promise,t=t.then(function(){return e._pdfDocument.getPage(n+1).then(function(e){return e.getTextContent({normalizeWhitespace:!0})}).then(function(t){for(var i=t.items,r=[],o=0,s=i.length;o0)return a.matchIdx=t?a.matchIdx-1:a.matchIdx+1,void this._updateMatch(!0);this._advanceOffsetPage(t)}this._nextPageMatch()}}else this._updateUIState(s.FOUND)}},{key:"_matchesReady",value:function(e){var t=this._offset,n=e.length,i=this._state.findPrevious;return n?(t.matchIdx=i?n-1:0,this._updateMatch(!0),!0):(this._advanceOffsetPage(i),!!(t.wrapped&&(t.matchIdx=null,this._pagesToSearch<0))&&(this._updateMatch(!1),!0))}},{key:"_nextPageMatch",value:function(){null!==this._resumePageIdx&&console.error("There can only be one pending page.");var e=null;do{var t=this._offset.pageIdx;if(!(e=this._pageMatches[t])){this._resumePageIdx=t;break}}while(!this._matchesReady(e))}},{key:"_advanceOffsetPage",value:function(e){var t=this._offset,n=this._linkService.pagesCount;t.pageIdx=e?t.pageIdx-1:t.pageIdx+1,t.matchIdx=null,this._pagesToSearch--,(t.pageIdx>=n||t.pageIdx<0)&&(t.pageIdx=e?n-1:0,t.wrapped=!0)}},{key:"_updateMatch",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=s.NOT_FOUND,n=this._offset.wrapped;if(this._offset.wrapped=!1,e){var i=this._selected.pageIdx;this._selected.pageIdx=this._offset.pageIdx,this._selected.matchIdx=this._offset.matchIdx,t=n?s.WRAPPED:s.FOUND,-1!==i&&i!==this._selected.pageIdx&&this._updatePage(i)}this._updateUIState(t,this._state.findPrevious),-1!==this._selected.pageIdx&&(this._scrollMatches=!0,this._updatePage(this._selected.pageIdx))}},{key:"_onFindBarClose",value:function(e){var t=this,n=this._pdfDocument;this._firstPageCapability.promise.then(function(){!t._pdfDocument||n&&t._pdfDocument!==n||(t._findTimeout&&(clearTimeout(t._findTimeout),t._findTimeout=null),t._resumePageIdx&&(t._resumePageIdx=null,t._dirtyMatch=!0),t._updateUIState(s.FOUND),t._highlightMatches=!1,t._updateAllPages())})}},{key:"_requestMatchesCount",value:function(){var e=this._selected,t=e.pageIdx,n=e.matchIdx,i=0,r=this._matchesCountTotal;if(-1!==n){for(var a=0;ar)&&(i=r=0),{current:i,total:r}}},{key:"_updateUIResultsCount",value:function(){this._eventBus.dispatch("updatefindmatchescount",{source:this,matchesCount:this._requestMatchesCount()})}},{key:"_updateUIState",value:function(e,t){this._eventBus.dispatch("updatefindcontrolstate",{source:this,state:e,previous:t,matchesCount:this._requestMatchesCount()})}},{key:"highlightMatches",get:function(){return this._highlightMatches}},{key:"pageMatches",get:function(){return this._pageMatches}},{key:"pageMatchesLength",get:function(){return this._pageMatchesLength}},{key:"selected",get:function(){return this._selected}},{key:"state",get:function(){return this._state}},{key:"_query",get:function(){return this._state.query!==this._rawQuery&&(this._rawQuery=this._state.query,this._normalizedQuery=c(this._state.query)),this._normalizedQuery}}])&&o(t.prototype,n),u&&o(t,u),e}();t.PDFFindController=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getCharacterType=function(e){if(function(e){return e<11904}(e))return function(e){return 0==(65408&e)}(e)?function(e){return 32===e||9===e||13===e||10===e}(e)?i.SPACE:function(e){return e>=97&&e<=122||e>=65&&e<=90}(e)||function(e){return e>=48&&e<=57}(e)||95===e?i.ALPHA_LETTER:i.PUNCT:function(e){return 3584==(65408&e)}(e)?i.THAI_LETTER:160===e?i.SPACE:i.ALPHA_LETTER;if(function(e){return e>=13312&&e<=40959||e>=63744&&e<=64255}(e))return i.HAN_LETTER;if(function(e){return e>=12448&&e<=12543}(e))return i.KATAKANA_LETTER;if(function(e){return e>=12352&&e<=12447}(e))return i.HIRAGANA_LETTER;if(function(e){return e>=65376&&e<=65439}(e))return i.HALFWIDTH_KATAKANA_LETTER;return i.ALPHA_LETTER},t.CharacterType=void 0;var i={SPACE:0,ALPHA_LETTER:1,PUNCT:2,HAN_LETTER:3,KATAKANA_LETTER:4,HIRAGANA_LETTER:5,HALFWIDTH_KATAKANA_LETTER:6,THAI_LETTER:7};t.CharacterType=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDestHashesEqual=c,t.isDestArraysEqual=d,t.PDFHistory=void 0;var i=n(5);function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],i=!0,r=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,a=e}finally{try{i||null==s.return||s.return()}finally{if(r)throw a}}return n}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);nthis._maxUid&&(this._maxUid=this._uid),void 0!==f.rotation&&(this._initialRotation=f.rotation),f.dest?(this._initialBookmark=JSON.stringify(f.dest),this._destination.page=null):f.hash?this._initialBookmark=f.hash:f.page&&(this._initialBookmark="page=".concat(f.page))}else console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.')}},{key:"reset",value:function(){this._initialized&&(this._pageHide(),this._initialized=!1,this._unbindEvents()),this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),this._initialBookmark=null,this._initialRotation=null}},{key:"push",value:function(e){var t=this,n=e.namedDest,i=void 0===n?null:n,r=e.explicitDest,a=e.pageNumber;if(this._initialized)if(i&&"string"!=typeof i)console.error("PDFHistory.push: "+'"'.concat(i,'" is not a valid namedDest parameter.'));else if(Array.isArray(r))if(Number.isInteger(a)&&a>0&&a<=this.linkService.pagesCount||null===a&&!this._destination){var o=i||JSON.stringify(r);if(o){var s=!1;if(this._destination&&(c(this._destination.hash,o)||d(this._destination.dest,r))){if(this._destination.page)return;s=!0}this._popStateInProgress&&!s||(this._pushOrReplaceState({dest:r,hash:o,page:a,rotation:this.linkService.rotation},s),this._popStateInProgress||(this._popStateInProgress=!0,Promise.resolve().then(function(){t._popStateInProgress=!1})))}}else console.error("PDFHistory.push: "+'"'.concat(a,'" is not a valid pageNumber parameter.'));else console.error("PDFHistory.push: "+'"'.concat(r,'" is not a valid explicitDest parameter.'))}},{key:"pushCurrentPosition",value:function(){this._initialized&&!this._popStateInProgress&&this._tryPushCurrentPosition()}},{key:"back",value:function(){if(this._initialized&&!this._popStateInProgress){var e=window.history.state;this._isValidState(e)&&e.uid>0&&window.history.back()}}},{key:"forward",value:function(){if(this._initialized&&!this._popStateInProgress){var e=window.history.state;this._isValidState(e)&&e.uid1&&void 0!==arguments[1]&&arguments[1]||!this._destination,i={fingerprint:this._fingerprint,uid:n?this._uid:this._uid+1,destination:e};if(this._updateInternalState(e,i.uid),this._updateUrl&&e&&e.hash){var r=document.location.href.split("#")[0];r.startsWith("file://")||(t="".concat(r,"#").concat(e.hash))}n?window.history.replaceState(i,"",t):(this._maxUid=this._uid,window.history.pushState(i,"",t))}},{key:"_tryPushCurrentPosition",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this._position){var t=this._position;if(e&&((t=Object.assign(Object.create(null),this._position)).temporary=!0),this._destination){if(this._destination.temporary)this._pushOrReplaceState(t,!0);else if(this._destination.hash!==t.hash&&(this._destination.page||!(this._numPositionUpdates<=50))){var n=!1;if(this._destination.page>=t.first&&this._destination.page<=t.page){if(this._destination.dest||!this._destination.first)return;n=!0}this._pushOrReplaceState(t,n)}}else this._pushOrReplaceState(t)}}},{key:"_isValidState",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!e)return!1;if(e.fingerprint!==this._fingerprint){if(!t)return!1;if("string"!=typeof e.fingerprint||e.fingerprint.length!==this._fingerprint.length)return!1;var n=a(performance.getEntriesByType("navigation"),1)[0];if(!n||"reload"!==n.type)return!1}return!(!Number.isInteger(e.uid)||e.uid<0)&&(null!==e.destination&&"object"===r(e.destination))}},{key:"_updateInternalState",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),n&&e&&e.temporary&&delete e.temporary,this._destination=e,this._uid=t,this._numPositionUpdates=0}},{key:"_parseCurrentHash",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=unescape(u()).substring(1),n=(0,i.parseQueryString)(t),r=n.nameddest||"",a=0|n.page;return Number.isInteger(a)&&a>0&&a<=this.linkService.pagesCount&&!(e&&r.length>0)||(a=null),{hash:t,page:a,rotation:this.linkService.rotation}}},{key:"_updateViewarea",value:function(e){var t=this,n=e.location;this._updateViewareaTimeout&&(clearTimeout(this._updateViewareaTimeout),this._updateViewareaTimeout=null),this._position={hash:this._isViewerInPresentationMode?"page=".concat(n.pageNumber):n.pdfOpenParams.substring(1),page:this.linkService.page,first:n.pageNumber,rotation:n.rotation},this._popStateInProgress||(this._isPagesLoaded&&this._destination&&!this._destination.page&&this._numPositionUpdates++,this._updateViewareaTimeout=setTimeout(function(){t._popStateInProgress||t._tryPushCurrentPosition(!0),t._updateViewareaTimeout=null},1e3))}},{key:"_popState",value:function(e){var t=this,n=e.state,r=u(),a=this._currentHash!==r;if(this._currentHash=r,n){if(this._isValidState(n)){this._popStateInProgress=!0,a&&(this._blockHashChange++,(0,i.waitOnEventOrTimeout)({target:window,name:"hashchange",delay:1e3}).then(function(){t._blockHashChange--}));var o=n.destination;this._updateInternalState(o,n.uid,!0),this._uid>this._maxUid&&(this._maxUid=this._uid),(0,i.isValidRotation)(o.rotation)&&(this.linkService.rotation=o.rotation),o.dest?this.linkService.navigateTo(o.dest):o.hash?this.linkService.setHash(o.hash):o.page&&(this.linkService.page=o.page),Promise.resolve().then(function(){t._popStateInProgress=!1})}}else{this._uid++;var s=this._parseCurrentHash(),l=s.hash,c=s.page,d=s.rotation;this._pushOrReplaceState({hash:l,page:c,rotation:d},!0)}}},{key:"_pageHide",value:function(){this._destination&&!this._destination.temporary||this._tryPushCurrentPosition()}},{key:"_bindEvents",value:function(){this._boundEvents||(this._boundEvents={updateViewarea:this._updateViewarea.bind(this),popState:this._popState.bind(this),pageHide:this._pageHide.bind(this)},this.eventBus._on("updateviewarea",this._boundEvents.updateViewarea),window.addEventListener("popstate",this._boundEvents.popState),window.addEventListener("pagehide",this._boundEvents.pageHide))}},{key:"_unbindEvents",value:function(){this._boundEvents&&(this.eventBus._off("updateviewarea",this._boundEvents.updateViewarea),window.removeEventListener("popstate",this._boundEvents.popState),window.removeEventListener("pagehide",this._boundEvents.pageHide),this._boundEvents=null)}},{key:"popStateInProgress",get:function(){return this._initialized&&(this._popStateInProgress||this._blockHashChange>0)}},{key:"initialBookmark",get:function(){return this._initialized?this._initialBookmark:null}},{key:"initialRotation",get:function(){return this._initialized?this._initialRotation:null}}])&&s(t.prototype,n),o&&s(t,o),e}();function c(e,t){return"string"==typeof e&&"string"==typeof t&&(e===t||(0,i.parseQueryString)(e).nameddest===t)}function d(e,t){function n(e,t){if(r(e)!==r(t))return!1;if(Array.isArray(e)||Array.isArray(t))return!1;if(null!==e&&"object"===r(e)&&null!==t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var i in e)if(!n(e[i],t[i]))return!1;return!0}return e===t||Number.isNaN(e)&&Number.isNaN(t)}if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!==t.length)return!1;for(var i=0,a=e.length;i0&&void 0!==arguments[0]?arguments[0]:{},n=t.eventBus,i=t.externalLinkTarget,r=void 0===i?null:i,o=t.externalLinkRel,s=void 0===o?null:o,u=t.externalLinkEnabled,l=void 0===u||u,c=t.ignoreDestinationZoom,d=void 0!==c&&c;a(this,e),this.eventBus=n,this.externalLinkTarget=r,this.externalLinkRel=s,this.externalLinkEnabled=l,this._ignoreDestinationZoom=d,this.baseUrl=null,this.pdfDocument=null,this.pdfViewer=null,this.pdfHistory=null,this._pagesRefCache=null}return s(e,[{key:"setDocument",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.baseUrl=t,this.pdfDocument=e,this._pagesRefCache=Object.create(null)}},{key:"setViewer",value:function(e){this.pdfViewer=e}},{key:"setHistory",value:function(e){this.pdfHistory=e}},{key:"navigateTo",value:function(e){var t=this;new Promise(function(n,i){"string"!=typeof e?n({namedDest:"",explicitDest:e}):t.pdfDocument.getDestination(e).then(function(t){n({namedDest:e,explicitDest:t})})}).then(function(n){Array.isArray(n.explicitDest)?function n(i){var r,a=i.namedDest,o=i.explicitDest,s=o[0];if(s instanceof Object){if(null===(r=t._cachedPageNumber(s)))return void t.pdfDocument.getPageIndex(s).then(function(e){t.cachePageRef(e+1,s),n({namedDest:a,explicitDest:o})}).catch(function(){console.error('PDFLinkService.navigateTo: "'.concat(s,'" is not ')+'a valid page reference, for dest="'.concat(e,'".'))})}else{if(!Number.isInteger(s))return void console.error('PDFLinkService.navigateTo: "'.concat(s,'" is not ')+'a valid destination reference, for dest="'.concat(e,'".'));r=s+1}!r||r<1||r>t.pagesCount?console.error('PDFLinkService.navigateTo: "'.concat(r,'" is not ')+'a valid page number, for dest="'.concat(e,'".')):(t.pdfHistory&&(t.pdfHistory.pushCurrentPosition(),t.pdfHistory.push({namedDest:a,explicitDest:o,pageNumber:r})),t.pdfViewer.scrollPageIntoView({pageNumber:r,destArray:o,ignoreDestinationZoom:t._ignoreDestinationZoom}))}(n):console.error('PDFLinkService.navigateTo: "'.concat(n.explicitDest,'" is')+' not a valid destination array, for dest="'.concat(e,'".'))})}},{key:"getDestinationHash",value:function(e){if("string"==typeof e)return this.getAnchorUrl("#"+escape(e));if(Array.isArray(e)){var t=JSON.stringify(e);return this.getAnchorUrl("#"+escape(t))}return this.getAnchorUrl("")}},{key:"getAnchorUrl",value:function(e){return(this.baseUrl||"")+e}},{key:"setHash",value:function(e){var t,n;if(e.includes("=")){var a=(0,i.parseQueryString)(e);if("search"in a&&this.eventBus.dispatch("findfromurlhash",{source:this,query:a.search.replace(/"/g,""),phraseSearch:"true"===a.phrase}),"page"in a&&(t=0|a.page||1),"zoom"in a){var o=a.zoom.split(","),s=o[0],u=parseFloat(s);s.includes("Fit")?"Fit"===s||"FitB"===s?n=[null,{name:s}]:"FitH"===s||"FitBH"===s||"FitV"===s||"FitBV"===s?n=[null,{name:s},o.length>1?0|o[1]:null]:"FitR"===s?5!==o.length?console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'):n=[null,{name:s},0|o[1],0|o[2],0|o[3],0|o[4]]:console.error('PDFLinkService.setHash: "'.concat(s,'" is not ')+"a valid zoom value."):n=[null,{name:"XYZ"},o.length>1?0|o[1]:null,o.length>2?0|o[2]:null,u?u/100:s]}n?this.pdfViewer.scrollPageIntoView({pageNumber:t||this.page,destArray:n,allowNegativeOffset:!0}):t&&(this.page=t),"pagemode"in a&&this.eventBus.dispatch("pagemode",{source:this,mode:a.pagemode}),"nameddest"in a&&this.navigateTo(a.nameddest)}else{n=unescape(e);try{n=JSON.parse(n),Array.isArray(n)||(n=n.toString())}catch(e){}if("string"==typeof n||function(e){if(!Array.isArray(e))return!1;var t=e.length;if(t<2)return!1;var n=e[0];if(!("object"===r(n)&&Number.isInteger(n.num)&&Number.isInteger(n.gen)||Number.isInteger(n)&&n>=0))return!1;var i=e[1];if("object"!==r(i)||"string"!=typeof i.name)return!1;var a=!0;switch(i.name){case"XYZ":if(5!==t)return!1;break;case"Fit":case"FitB":return 2===t;case"FitH":case"FitBH":case"FitV":case"FitBV":if(3!==t)return!1;break;case"FitR":if(6!==t)return!1;a=!1;break;default:return!1}for(var o=2;o1&&this.page--;break;case"LastPage":this.page=this.pagesCount;break;case"FirstPage":this.page=1}this.eventBus.dispatch("namedaction",{source:this,action:e})}},{key:"cachePageRef",value:function(e,t){if(t){var n=0===t.gen?"".concat(t.num,"R"):"".concat(t.num,"R").concat(t.gen);this._pagesRefCache[n]=e}}},{key:"_cachedPageNumber",value:function(e){var t=0===e.gen?"".concat(e.num,"R"):"".concat(e.num,"R").concat(e.gen);return this._pagesRefCache&&this._pagesRefCache[t]||null}},{key:"isPageVisible",value:function(e){return this.pdfViewer.isPageVisible(e)}},{key:"pagesCount",get:function(){return this.pdfDocument?this.pdfDocument.numPages:0}},{key:"page",get:function(){return this.pdfViewer.currentPageNumber},set:function(e){this.pdfViewer.currentPageNumber=e}},{key:"rotation",get:function(){return this.pdfViewer.pagesRotation},set:function(e){this.pdfViewer.pagesRotation=e}}]),e}();t.PDFLinkService=u;var l=function(){function e(){a(this,e),this.externalLinkTarget=null,this.externalLinkRel=null,this.externalLinkEnabled=!0,this._ignoreDestinationZoom=!1}return s(e,[{key:"navigateTo",value:function(e){}},{key:"getDestinationHash",value:function(e){return"#"}},{key:"getAnchorUrl",value:function(e){return"#"}},{key:"setHash",value:function(e){}},{key:"executeNamedAction",value:function(e){}},{key:"cachePageRef",value:function(e,t){}},{key:"isPageVisible",value:function(e){return!0}},{key:"pagesCount",get:function(){return 0}},{key:"page",get:function(){return 0},set:function(e){}},{key:"rotation",get:function(){return 0},set:function(e){}}]),e}();t.SimpleLinkService=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFOutlineViewer=void 0;var i=n(8);function r(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,u=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){u=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(u)throw o}}}}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1]&&arguments[1];this.lastToggleIsShow=t;var n,i=r(e.querySelectorAll(".outlineItemToggler"));try{for(i.s();!(n=i.n()).done;){n.value.classList.toggle("outlineItemsHidden",!t)}}catch(e){i.e(e)}finally{i.f()}}},{key:"toggleOutlineTree",value:function(){this.outline&&this._toggleOutlineItem(this.container,!this.lastToggleIsShow)}},{key:"render",value:function(e){var t=e.outline,n=0;if(this.outline&&this.reset(),this.outline=t||null,t){for(var a=document.createDocumentFragment(),o=[{parent:a,items:this.outline}],s=!1;o.length>0;){var u,l=o.shift(),c=r(l.items);try{for(c.s();!(u=c.n()).done;){var d=u.value,h=document.createElement("div");h.className="outlineItem";var f=document.createElement("a");if(this._bindLink(f,d),this._setStyles(f,d),f.textContent=(0,i.removeNullCharacters)(d.title)||"–",h.appendChild(f),d.items.length>0){s=!0,this._addToggleButton(h,d);var p=document.createElement("div");p.className="outlineItems",h.appendChild(p),o.push({parent:p,items:d.items})}l.parent.appendChild(h),n++}}catch(e){c.e(e)}finally{c.f()}}s&&(this.container.classList.add("outlineWithDeepNesting"),this.lastToggleIsShow=0===a.querySelectorAll(".outlineItemsHidden").length),this.container.appendChild(a),this._dispatchEvent(n)}else this._dispatchEvent(n)}}])&&o(t.prototype,n),a&&o(t,a),e}();t.PDFOutlineViewer=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFPresentationMode=void 0;var i=n(5);function r(e,t){for(var n=0;nr&&n-r<50)&&((this.mouseScrollDelta>0&&t<0||this.mouseScrollDelta<0&&t>0)&&this._resetMouseScrollState(),this.mouseScrollDelta+=t,Math.abs(this.mouseScrollDelta)>=.1)){var a=this.mouseScrollDelta;this._resetMouseScrollState(),(a>0?this._goToPreviousPage():this._goToNextPage())&&(this.mouseScrollTimeStamp=n)}}}},{key:"_goToPreviousPage",value:function(){var e=this.pdfViewer.currentPageNumber;return!(e<=1)&&(this.pdfViewer.currentPageNumber=e-1,!0)}},{key:"_goToNextPage",value:function(){var e=this.pdfViewer.currentPageNumber;return!(e>=this.pdfViewer.pagesCount)&&(this.pdfViewer.currentPageNumber=e+1,!0)}},{key:"_notifyStateChange",value:function(){this.eventBus.dispatch("presentationmodechanged",{source:this,active:this.active,switchInProgress:!!this.switchInProgress})}},{key:"_setSwitchInProgress",value:function(){var e=this;this.switchInProgress&&clearTimeout(this.switchInProgress),this.switchInProgress=setTimeout(function(){e._removeFullscreenChangeListeners(),delete e.switchInProgress,e._notifyStateChange()},1500)}},{key:"_resetSwitchInProgress",value:function(){this.switchInProgress&&(clearTimeout(this.switchInProgress),delete this.switchInProgress)}},{key:"_enter",value:function(){var e=this;this.active=!0,this._resetSwitchInProgress(),this._notifyStateChange(),this.container.classList.add("pdfPresentationMode"),setTimeout(function(){e.pdfViewer.currentPageNumber=e.args.page,e.pdfViewer.currentScaleValue="page-fit"},0),this._addWindowListeners(),this._showControls(),this.contextMenuOpen=!1,this.container.setAttribute("contextmenu","viewerContextMenu"),window.getSelection().removeAllRanges()}},{key:"_exit",value:function(){var e=this,t=this.pdfViewer.currentPageNumber;this.container.classList.remove("pdfPresentationMode"),setTimeout(function(){e.active=!1,e._removeFullscreenChangeListeners(),e._notifyStateChange(),e.pdfViewer.currentScaleValue=e.args.previousScale,e.pdfViewer.currentPageNumber=t,e.args=null},0),this._removeWindowListeners(),this._hideControls(),this._resetMouseScrollState(),this.container.removeAttribute("contextmenu"),this.contextMenuOpen=!1}},{key:"_mouseDown",value:function(e){if(this.contextMenuOpen)return this.contextMenuOpen=!1,void e.preventDefault();0===e.button&&(e.target.href&&e.target.classList.contains("internalLink")||(e.preventDefault(),e.shiftKey?this._goToPreviousPage():this._goToNextPage()))}},{key:"_contextMenu",value:function(){this.contextMenuOpen=!0}},{key:"_showControls",value:function(){var e=this;this.controlsTimeout?clearTimeout(this.controlsTimeout):this.container.classList.add("pdfPresentationModeControls"),this.controlsTimeout=setTimeout(function(){e.container.classList.remove("pdfPresentationModeControls"),delete e.controlsTimeout},3e3)}},{key:"_hideControls",value:function(){this.controlsTimeout&&(clearTimeout(this.controlsTimeout),this.container.classList.remove("pdfPresentationModeControls"),delete this.controlsTimeout)}},{key:"_resetMouseScrollState",value:function(){this.mouseScrollTimeStamp=0,this.mouseScrollDelta=0}},{key:"_touchSwipe",value:function(e){if(this.active)if(e.touches.length>1)this.touchSwipeState=null;else switch(e.type){case"touchstart":this.touchSwipeState={startX:e.touches[0].pageX,startY:e.touches[0].pageY,endX:e.touches[0].pageX,endY:e.touches[0].pageY};break;case"touchmove":if(null===this.touchSwipeState)return;this.touchSwipeState.endX=e.touches[0].pageX,this.touchSwipeState.endY=e.touches[0].pageY,e.preventDefault();break;case"touchend":if(null===this.touchSwipeState)return;var t=0,n=this.touchSwipeState.endX-this.touchSwipeState.startX,i=this.touchSwipeState.endY-this.touchSwipeState.startY,r=Math.abs(Math.atan2(i,n));Math.abs(n)>50&&(r<=a||r>=Math.PI-a)?t=n:Math.abs(i)>50&&Math.abs(r-Math.PI/2)<=a&&(t=i),t>0?this._goToPreviousPage():t<0&&this._goToNextPage()}}},{key:"_addWindowListeners",value:function(){this.showControlsBind=this._showControls.bind(this),this.mouseDownBind=this._mouseDown.bind(this),this.mouseWheelBind=this._mouseWheel.bind(this),this.resetMouseScrollStateBind=this._resetMouseScrollState.bind(this),this.contextMenuBind=this._contextMenu.bind(this),this.touchSwipeBind=this._touchSwipe.bind(this),window.addEventListener("mousemove",this.showControlsBind),window.addEventListener("mousedown",this.mouseDownBind),window.addEventListener("wheel",this.mouseWheelBind,{passive:!1}),window.addEventListener("keydown",this.resetMouseScrollStateBind),window.addEventListener("contextmenu",this.contextMenuBind),window.addEventListener("touchstart",this.touchSwipeBind),window.addEventListener("touchmove",this.touchSwipeBind),window.addEventListener("touchend",this.touchSwipeBind)}},{key:"_removeWindowListeners",value:function(){window.removeEventListener("mousemove",this.showControlsBind),window.removeEventListener("mousedown",this.mouseDownBind),window.removeEventListener("wheel",this.mouseWheelBind,{passive:!1}),window.removeEventListener("keydown",this.resetMouseScrollStateBind),window.removeEventListener("contextmenu",this.contextMenuBind),window.removeEventListener("touchstart",this.touchSwipeBind),window.removeEventListener("touchmove",this.touchSwipeBind),window.removeEventListener("touchend",this.touchSwipeBind),delete this.showControlsBind,delete this.mouseDownBind,delete this.mouseWheelBind,delete this.resetMouseScrollStateBind,delete this.contextMenuBind,delete this.touchSwipeBind}},{key:"_fullscreenChange",value:function(){this.isFullscreen?this._enter():this._exit()}},{key:"_addFullscreenChangeListeners",value:function(){this.fullscreenChangeBind=this._fullscreenChange.bind(this),window.addEventListener("fullscreenchange",this.fullscreenChangeBind),window.addEventListener("mozfullscreenchange",this.fullscreenChangeBind),window.addEventListener("webkitfullscreenchange",this.fullscreenChangeBind),window.addEventListener("MSFullscreenChange",this.fullscreenChangeBind)}},{key:"_removeFullscreenChangeListeners",value:function(){window.removeEventListener("fullscreenchange",this.fullscreenChangeBind),window.removeEventListener("mozfullscreenchange",this.fullscreenChangeBind),window.removeEventListener("webkitfullscreenchange",this.fullscreenChangeBind),window.removeEventListener("MSFullscreenChange",this.fullscreenChangeBind),delete this.fullscreenChangeBind}},{key:"isFullscreen",get:function(){return!!(document.fullscreenElement||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement)}}])&&r(t.prototype,n),o&&r(t,o),e}();t.PDFPresentationMode=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFSidebarResizer=void 0;var i=n(5);function r(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:i.NullL10n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.enabled=!1,this.isRTL=!1,this.sidebarOpen=!1,this.doc=document.documentElement,this._width=null,this._outerContainerWidth=null,this._boundEvents=Object.create(null),this.outerContainer=t.outerContainer,this.resizer=t.resizer,this.eventBus=n,this.l10n=s,"undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports(a,"calc(-1 * ".concat(o,"px)"))?(this.enabled=!0,this.resizer.classList.remove("hidden"),this.l10n.getDirection().then(function(e){r.isRTL="rtl"===e}),this._addEventListeners()):console.warn("PDFSidebarResizer: The browser does not support resizing of the sidebar.")}var t,n,s;return t=e,(n=[{key:"_updateWidth",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;if(!this.enabled)return!1;var t=(0,i.clamp)(e,o,Math.floor(this.outerContainerWidth/2));return t!==this._width&&(this._width=t,this.doc.style.setProperty(a,"".concat(t,"px")),!0)}},{key:"_mouseMove",value:function(e){var t=e.clientX;this.isRTL&&(t=this.outerContainerWidth-t),this._updateWidth(t)}},{key:"_mouseUp",value:function(e){this.outerContainer.classList.remove("sidebarResizing"),this.eventBus.dispatch("resize",{source:this});var t=this._boundEvents;window.removeEventListener("mousemove",t.mouseMove),window.removeEventListener("mouseup",t.mouseUp)}},{key:"_addEventListeners",value:function(){var e=this;if(this.enabled){var t=this._boundEvents;t.mouseMove=this._mouseMove.bind(this),t.mouseUp=this._mouseUp.bind(this),this.resizer.addEventListener("mousedown",function(n){0===n.button&&(e.outerContainer.classList.add("sidebarResizing"),window.addEventListener("mousemove",t.mouseMove),window.addEventListener("mouseup",t.mouseUp))}),this.eventBus._on("sidebarviewchanged",function(t){e.sidebarOpen=!(!t||!t.view)}),this.eventBus._on("resize",function(t){if(t&&t.source===window&&(e._outerContainerWidth=null,e._width))if(e.sidebarOpen){e.outerContainer.classList.add("sidebarResizing");var n=e._updateWidth(e._width);Promise.resolve().then(function(){e.outerContainer.classList.remove("sidebarResizing"),n&&e.eventBus.dispatch("resize",{source:e})})}else e._updateWidth(e._width)})}}},{key:"outerContainerWidth",get:function(){return this._outerContainerWidth||(this._outerContainerWidth=this.outerContainer.clientWidth),this._outerContainerWidth}}])&&r(t.prototype,n),s&&r(t,s),e}();t.PDFSidebarResizer=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFThumbnailViewer=void 0;var i=n(5),r=n(26);function a(e,t){for(var n=0;n0){var a=n.first.id,o=r>1?n.last.id:a,s=!1;e<=a||e>=o?s=!0:n.views.some(function(t){return t.id===e&&(s=t.percent<100,!0)}),s&&(0,i.scrollIntoView)(t.div,{top:-19})}this._currentPageNumber=e}else console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.')}}},{key:"cleanup",value:function(){r.PDFThumbnailView.cleanup()}},{key:"_resetView",value:function(){this._thumbnails=[],this._currentPageNumber=1,this._pageLabels=null,this._pagesRotation=0,this._pagesRequests=new WeakMap,this.container.textContent=""}},{key:"setDocument",value:function(e){var t=this;this.pdfDocument&&(this._cancelRendering(),this._resetView()),this.pdfDocument=e,e&&e.getPage(1).then(function(n){for(var i=e.numPages,a=n.getViewport({scale:1}),o=1;o<=i;++o){var s=new r.PDFThumbnailView({container:t.container,id:o,defaultViewport:a.clone(),linkService:t.linkService,renderingQueue:t.renderingQueue,disableCanvasToImageConversion:!1,l10n:t.l10n});t._thumbnails.push(s)}var u=t._thumbnails[0];u&&u.setPdfPage(n),t._thumbnails[t._currentPageNumber-1].div.classList.add("selected")}).catch(function(e){console.error("Unable to initialize thumbnail viewer",e)})}},{key:"_cancelRendering",value:function(){for(var e=0,t=this._thumbnails.length;e=0;n--)e.removeChild(t[n]);var i=2*u;e.style.width=this.canvasWidth+i+"px",e.style.height=this.canvasHeight+i+"px",this.canvas&&(this.canvas.width=0,this.canvas.height=0,delete this.canvas),this.image&&(this.image.removeAttribute("src"),delete this.image)}},{key:"update",value:function(e){void 0!==e&&(this.rotation=e);var t=(this.rotation+this.pdfPageRotate)%360;this.viewport=this.viewport.clone({scale:1,rotation:t}),this.reset()}},{key:"cancelRendering",value:function(){this.renderTask&&(this.renderTask.cancel(),this.renderTask=null),this.resume=null}},{key:"_getPageDrawContext",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=document.createElement("canvas");this.canvas=t,t.mozOpaque=!0;var n=t.getContext("2d",{alpha:!1}),i=(0,r.getOutputScale)(n);return t.width=this.canvasWidth*i.sx|0,t.height=this.canvasHeight*i.sy|0,t.style.width=this.canvasWidth+"px",t.style.height=this.canvasHeight+"px",!e&&i.scaled&&n.scale(i.sx,i.sy),n}},{key:"_convertCanvasToImage",value:function(){var e=this;if(this.canvas&&this.renderingState===a.RenderingStates.FINISHED){if(this.disableCanvasToImageConversion)return this.canvas.className="thumbnailImage",this._thumbPageCanvas.then(function(t){e.canvas.setAttribute("aria-label",t)}),this.div.setAttribute("data-loaded",!0),void this.ring.appendChild(this.canvas);var t=document.createElement("img");t.className="thumbnailImage",this._thumbPageCanvas.then(function(e){t.setAttribute("aria-label",e)}),t.style.width=this.canvasWidth+"px",t.style.height=this.canvasHeight+"px",t.src=this.canvas.toDataURL(),this.image=t,this.div.setAttribute("data-loaded",!0),this.ring.appendChild(t),this.canvas.width=0,this.canvas.height=0,delete this.canvas}}},{key:"draw",value:function(){var e=this;if(this.renderingState!==a.RenderingStates.INITIAL)return console.error("Must be in new state before drawing"),Promise.resolve(void 0);var t=this.pdfPage;if(!t)return this.renderingState=a.RenderingStates.FINISHED,Promise.reject(new Error("pdfPage is not loaded"));this.renderingState=a.RenderingStates.RUNNING;var n=(0,i.createPromiseCapability)(),r=function(t){s===e.renderTask&&(e.renderTask=null),t instanceof i.RenderingCancelledException?n.resolve(void 0):(e.renderingState=a.RenderingStates.FINISHED,e._convertCanvasToImage(),t?n.reject(t):n.resolve(void 0))},o={canvasContext:this._getPageDrawContext(),viewport:this.viewport.clone({scale:this.scale})},s=this.renderTask=t.render(o);return s.onContinue=function(t){if(!e.renderingQueue.isHighestPriority(e))return e.renderingState=a.RenderingStates.PAUSED,void(e.resume=function(){e.renderingState=a.RenderingStates.RUNNING,t()});t()},s.promise.then(function(){r(null)},function(e){r(e)}),n.promise}},{key:"setImage",value:function(e){if(this.renderingState===a.RenderingStates.INITIAL){var t=e.canvas;if(t){this.pdfPage||this.setPdfPage(e.pdfPage),this.renderingState=a.RenderingStates.FINISHED;var n=this._getPageDrawContext(!0),i=n.canvas;if(t.width<=2*i.width)return n.drawImage(t,0,0,t.width,t.height,0,0,i.width,i.height),void this._convertCanvasToImage();for(var r=i.width<<3,o=i.height<<3,s=c.getCanvas(r,o),u=s.getContext("2d");r>t.width||o>t.height;)r>>=1,o>>=1;for(u.drawImage(t,0,0,t.width,t.height,0,0,r,o);r>2*i.width;)u.drawImage(s,0,0,r,o,0,0,r>>1,o>>1),r>>=1,o>>=1;n.drawImage(s,0,0,r,o,0,0,i.width,i.height),this._convertCanvasToImage()}}}},{key:"setPageLabel",value:function(e){var t=this;this.pageLabel="string"==typeof e?e:null,this._thumbPageTitle.then(function(e){t.anchor.title=e}),this.renderingState===a.RenderingStates.FINISHED&&this._thumbPageCanvas.then(function(e){t.image?t.image.setAttribute("aria-label",e):t.disableCanvasToImageConversion&&t.canvas&&t.canvas.setAttribute("aria-label",e)})}},{key:"_thumbPageTitle",get:function(){return this.l10n.get("thumb_page_title",{page:null!==this.pageLabel?this.pageLabel:this.id},"Page {{page}}")}},{key:"_thumbPageCanvas",get:function(){return this.l10n.get("thumb_page_canvas",{page:null!==this.pageLabel?this.pageLabel:this.id},"Thumbnail of Page {{page}}")}}])&&o(t.prototype,n),s&&o(t,s),e}();t.PDFThumbnailView=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFViewer=void 0;var i=n(28),r=n(8);function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,u=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){u=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(u)throw a}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);nc+d)&&(i={left:0,top:0})}l(h(f.prototype),"_scrollIntoView",this).call(this,{pageDiv:t,pageSpot:i,pageNumber:a})}},{key:"_getVisiblePages",value:function(){return this.isInPresentationMode?this._getCurrentVisiblePage():l(h(f.prototype),"_getVisiblePages",this).call(this)}},{key:"_updateHelper",value:function(e){if(!this.isInPresentationMode){var t,n=this._currentPageNumber,i=!1,r=o(e);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(a.percent<100)break;if(a.id===n){i=!0;break}}}catch(e){r.e(e)}finally{r.f()}i||(n=e[0].id),this._setCurrentPageNumber(n)}}},{key:"_viewerElement",get:function(){return(0,r.shadow)(this,"_viewerElement",this.viewer)}}])&&u(t.prototype,n),a&&u(t,a),f}();t.PDFViewer=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BaseViewer=void 0;var i=n(5),r=n(11),a=n(29),o=n(8),s=n(30),u=n(21),l=n(31);function c(e,t){for(var n=0;n=0&&t.splice(i,1),t.push(n),t.length>e&&t.shift().destroy()},this.resize=function(n,r){if(e=n,r){for(var a=new Set,o=0,s=r.length;oe;)t.shift().destroy()}}var h=function(){function e(t){var n=this;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.constructor===e)throw new Error("Cannot initialize BaseViewer.");this._name=this.constructor.name,this.container=t.container,this.viewer=t.viewer||t.container.firstElementChild,this.eventBus=t.eventBus,this.linkService=t.linkService||new u.SimpleLinkService,this.downloadManager=t.downloadManager||null,this.findController=t.findController||null,this.removePageBorders=t.removePageBorders||!1,this.textLayerMode=Number.isInteger(t.textLayerMode)?t.textLayerMode:i.TextLayerMode.ENABLE,this.imageResourcesPath=t.imageResourcesPath||"",this.renderInteractiveForms=t.renderInteractiveForms||!1,this.enablePrintAutoRotate=t.enablePrintAutoRotate||!1,this.renderer=t.renderer||i.RendererType.CANVAS,this.enableWebGL=t.enableWebGL||!1,this.useOnlyCssZoom=t.useOnlyCssZoom||!1,this.maxCanvasPixels=t.maxCanvasPixels,this.l10n=t.l10n||i.NullL10n,this.defaultRenderingQueue=!t.renderingQueue,this.defaultRenderingQueue?(this.renderingQueue=new r.PDFRenderingQueue,this.renderingQueue.setViewer(this)):this.renderingQueue=t.renderingQueue,this.scroll=(0,i.watchScroll)(this.container,this._scrollUpdate.bind(this)),this.presentationModeState=i.PresentationModeState.UNKNOWN,this._onBeforeDraw=this._onAfterDraw=null,this._resetView(),this.removePageBorders&&this.viewer.classList.add("removePageBorders"),Promise.resolve().then(function(){n.eventBus.dispatch("baseviewerinit",{source:n})})}var t,n,h;return t=e,(n=[{key:"getPageView",value:function(e){return this._pages[e]}},{key:"_setCurrentPageNumber",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this._currentPageNumber===e?(t&&this._resetCurrentPageView(),!0):07500)t._pagesCapability.resolve();else{var i=n-1;if(i<=0)t._pagesCapability.resolve();else for(var r=function(n){e.getPage(n).then(function(e){var r=t._pages[n-1];r.pdfPage||r.setPdfPage(e),t.linkService.cachePageRef(n,e.ref),0==--i&&t._pagesCapability.resolve()},function(e){console.error("Unable to get page ".concat(n," to initialize viewer"),e),0==--i&&t._pagesCapability.resolve()})},a=2;a<=n;++a)r(a)}}),t.eventBus.dispatch("pagesinit",{source:t}),t.defaultRenderingQueue&&t.update()}).catch(function(e){console.error("Unable to initialize viewer",e)})}}},{key:"setPageLabels",value:function(e){if(this.pdfDocument){e?Array.isArray(e)&&this.pdfDocument.numPages===e.length?this._pageLabels=e:(this._pageLabels=null,console.error("".concat(this._name,".setPageLabels: Invalid page labels."))):this._pageLabels=null;for(var t=0,n=this._pages.length;t2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(this._currentScaleValue=t.toString(),function(e,t){return t===e||Math.abs(t-e)<1e-15}(this._currentScale,e))i&&this.eventBus.dispatch("scalechanging",{source:this,scale:e,presetValue:t});else{for(var r=0,a=this._pages.length;r1&&void 0!==arguments[1]&&arguments[1],n=parseFloat(e);if(n>0)this._setScaleUpdatePages(n,e,t,!1);else{var r=this._pages[this._currentPageNumber-1];if(!r)return;var a=this.isInPresentationMode||this.removePageBorders,o=a?0:i.SCROLLBAR_PADDING,s=a?0:i.VERTICAL_PADDING;if(!a&&this._isScrollModeHorizontal){var u=[s,o];o=u[0],s=u[1]}var l=(this.container.clientWidth-o)/r.width*r.scale,c=(this.container.clientHeight-s)/r.height*r.scale;switch(e){case"page-actual":n=1;break;case"page-width":n=l;break;case"page-height":n=c;break;case"page-fit":n=Math.min(l,c);break;case"auto":var d=(0,i.isPortraitOrientation)(r)?l:Math.min(c,l);n=Math.min(i.MAX_AUTO_SCALE,d);break;default:return void console.error("".concat(this._name,'._setScale: "').concat(e,'" is an unknown zoom value.'))}this._setScaleUpdatePages(n,e,t,!0)}}},{key:"_resetCurrentPageView",value:function(){this.isInPresentationMode&&this._setScale(this._currentScaleValue,!0);var e=this._pages[this._currentPageNumber-1];this._scrollIntoView({pageDiv:e.div})}},{key:"scrollPageIntoView",value:function(e){var t=e.pageNumber,n=e.destArray,r=void 0===n?null:n,a=e.allowNegativeOffset,o=void 0!==a&&a,s=e.ignoreDestinationZoom,u=void 0!==s&&s;if(this.pdfDocument){var l=Number.isInteger(t)&&this._pages[t-1];if(l)if(!this.isInPresentationMode&&r){var c,d,h=0,f=0,p=0,v=0,g=l.rotation%180!=0,m=(g?l.height:l.width)/l.scale/i.CSS_UNITS,y=(g?l.width:l.height)/l.scale/i.CSS_UNITS,b=0;switch(r[1].name){case"XYZ":h=r[2],f=r[3],b=r[4],h=null!==h?h:0,f=null!==f?f:y;break;case"Fit":case"FitB":b="page-fit";break;case"FitH":case"FitBH":b="page-width",null===(f=r[2])&&this._location&&(h=this._location.left,f=this._location.top);break;case"FitV":case"FitBV":h=r[2],p=m,v=y,b="page-height";break;case"FitR":h=r[2],f=r[3],p=r[4]-h,v=r[5]-f;var w=this.removePageBorders?0:i.SCROLLBAR_PADDING,_=this.removePageBorders?0:i.VERTICAL_PADDING;c=(this.container.clientWidth-w)/p/i.CSS_UNITS,d=(this.container.clientHeight-_)/v/i.CSS_UNITS,b=Math.min(Math.abs(c),Math.abs(d));break;default:return void console.error("".concat(this._name,".scrollPageIntoView: ")+'"'.concat(r[1].name,'" is not a valid destination type.'))}if(u||(b&&b!==this._currentScale?this.currentScaleValue=b:this._currentScale===i.UNKNOWN_SCALE&&(this.currentScaleValue=i.DEFAULT_SCALE_VALUE)),"page-fit"!==b||r[4]){var P=[l.viewport.convertToViewportPoint(h,f),l.viewport.convertToViewportPoint(h+p,f+v)],S=Math.min(P[0][0],P[1][0]),k=Math.min(P[0][1],P[1][1]);o||(S=Math.max(S,0),k=Math.max(k,0)),this._scrollIntoView({pageDiv:l.div,pageSpot:{left:S,top:k},pageNumber:t})}else this._scrollIntoView({pageDiv:l.div,pageNumber:t})}else this._setCurrentPageNumber(t,!0);else console.error("".concat(this._name,".scrollPageIntoView: ")+'"'.concat(t,'" is not a valid pageNumber parameter.'))}}},{key:"_updateLocation",value:function(e){var t=this._currentScale,n=this._currentScaleValue,i=parseFloat(n)===t?Math.round(1e4*t)/100:n,r=e.id,a="#page="+r;a+="&zoom="+i;var o=this._pages[r-1],s=this.container,u=o.getPagePoint(s.scrollLeft-e.x,s.scrollTop-e.y),l=Math.round(u[0]),c=Math.round(u[1]);a+=","+l+","+c,this._location={pageNumber:r,scale:i,top:c,left:l,rotation:this._pagesRotation,pdfOpenParams:a}}},{key:"_updateHelper",value:function(e){throw new Error("Not implemented: _updateHelper")}},{key:"update",value:function(){var e=this._getVisiblePages(),t=e.views,n=t.length;if(0!==n){var i=Math.max(10,2*n+1);this._buffer.resize(i,t),this.renderingQueue.renderHighestPriority(e),this._updateHelper(t),this._updateLocation(e.first),this.eventBus.dispatch("updateviewarea",{source:this,location:this._location})}}},{key:"containsElement",value:function(e){return this.container.contains(e)}},{key:"focus",value:function(){this.container.focus()}},{key:"_getCurrentVisiblePage",value:function(){if(!this.pagesCount)return{views:[]};var e=this._pages[this._currentPageNumber-1],t=e.div,n={id:e.id,x:t.offsetLeft+t.clientLeft,y:t.offsetTop+t.clientTop,view:e};return{first:n,last:n,views:[n]}}},{key:"_getVisiblePages",value:function(){return(0,i.getVisibleElements)(this.container,this._pages,!0,this._isScrollModeHorizontal)}},{key:"isPageVisible",value:function(e){return!!this.pdfDocument&&(e<1||e>this.pagesCount?(console.error("".concat(this._name,'.isPageVisible: "').concat(e,'" is out of bounds.')),!1):this._getVisiblePages().views.some(function(t){return t.id===e}))}},{key:"cleanup",value:function(){for(var e=0,t=this._pages.length;e3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4?arguments[4]:void 0;return new l.TextLayerBuilder({textLayerDiv:e,eventBus:r,pageIndex:t,viewport:n,findController:this.isInPresentationMode?null:this.findController,enhanceTextSelection:!this.isInPresentationMode&&i})}},{key:"createAnnotationLayerBuilder",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:i.NullL10n;return new a.AnnotationLayerBuilder({pageDiv:e,pdfPage:t,imageResourcesPath:n,renderInteractiveForms:r,linkService:this.linkService,downloadManager:this.downloadManager,l10n:o})}},{key:"getPagesOverview",value:function(){var e=this._pages.map(function(e){var t=e.pdfPage.getViewport({scale:1});return{width:t.width,height:t.height,rotation:t.rotation}});if(!this.enablePrintAutoRotate)return e;var t=(0,i.isPortraitOrientation)(e[0]);return e.map(function(e){return t===(0,i.isPortraitOrientation)(e)?e:{width:e.height,height:e.width,rotation:(e.rotation+90)%360}})}},{key:"_updateScrollMode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=this._scrollMode,n=this.viewer;n.classList.toggle("scrollHorizontal",t===i.ScrollMode.HORIZONTAL),n.classList.toggle("scrollWrapped",t===i.ScrollMode.WRAPPED),this.pdfDocument&&e&&(this._currentScaleValue&&isNaN(this._currentScaleValue)&&this._setScale(this._currentScaleValue,!0),this._setCurrentPageNumber(e,!0),this.update())}},{key:"_updateSpreadMode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(this.pdfDocument){var t=this.viewer,n=this._pages;if(t.textContent="",this._spreadMode===i.SpreadMode.NONE)for(var r=0,a=n.length;r=0&&(t=n+1)}this._setCurrentPageNumber(t,!0)||console.error("".concat(this._name,'.currentPageLabel: "').concat(e,'" is not a valid page.'))}}},{key:"currentScale",get:function(){return this._currentScale!==i.UNKNOWN_SCALE?this._currentScale:i.DEFAULT_SCALE},set:function(e){if(isNaN(e))throw new Error("Invalid numeric scale.");this.pdfDocument&&this._setScale(e,!1)}},{key:"currentScaleValue",get:function(){return this._currentScaleValue},set:function(e){this.pdfDocument&&this._setScale(e,!1)}},{key:"pagesRotation",get:function(){return this._pagesRotation},set:function(e){if(!(0,i.isValidRotation)(e))throw new Error("Invalid pages rotation angle.");if(this.pdfDocument&&this._pagesRotation!==e){this._pagesRotation=e;for(var t=this._currentPageNumber,n=0,r=this._pages.length;nthis.container.clientWidth}},{key:"isVerticalScrollbarEnabled",get:function(){return!this.isInPresentationMode&&this.container.scrollHeight>this.container.clientHeight}},{key:"hasEqualPageSizes",get:function(){for(var e=this._pages[0],t=1,n=this._pages.length;t1&&void 0!==arguments[1]?arguments[1]:"display";this.pdfPage.getAnnotations({intent:n}).then(function(n){if(!t._cancelled){var r={viewport:e.clone({dontFlip:!0}),div:t.div,annotations:n,page:t.pdfPage,imageResourcesPath:t.imageResourcesPath,renderInteractiveForms:t.renderInteractiveForms,linkService:t.linkService,downloadManager:t.downloadManager};if(t.div)i.AnnotationLayer.update(r);else{if(0===n.length)return;t.div=document.createElement("div"),t.div.className="annotationLayer",t.pageDiv.appendChild(t.div),r.div=t.div,i.AnnotationLayer.render(r),t.l10n.translate(t.div)}}})}},{key:"cancel",value:function(){this._cancelled=!0}},{key:"hide",value:function(){this.div&&this.div.setAttribute("hidden","true")}}]),e}();t.AnnotationLayerBuilder=l;var c=function(){function e(){o(this,e)}return u(e,[{key:"createAnnotationLayerBuilder",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:r.NullL10n;return new l({pageDiv:e,pdfPage:t,imageResourcesPath:n,renderInteractiveForms:i,linkService:new a.SimpleLinkService,l10n:o})}}]),e}();t.DefaultAnnotationLayerFactory=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFPageView=void 0;var i,r=(i=n(2))&&i.__esModule?i:{default:i},a=n(5),o=n(8),s=n(11);function u(e,t,n,i,r,a,o){try{var s=e[a](o),u=s.value}catch(e){return void n(e)}s.done?t(u):Promise.resolve(u).then(i,r)}function l(e,t){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];if(this.zoomLayer){var t=this.zoomLayer.firstChild;this.paintedViewportMap.delete(t),t.width=0,t.height=0,e&&this.zoomLayer.remove(),this.zoomLayer=null}}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.cancelRendering(t),this.renderingState=s.RenderingStates.INITIAL;var n=this.div;n.style.width=Math.floor(this.viewport.width)+"px",n.style.height=Math.floor(this.viewport.height)+"px";for(var i=n.childNodes,r=e&&this.zoomLayer||null,a=t&&this.annotationLayer&&this.annotationLayer.div||null,o=i.length-1;o>=0;o--){var u=i[o];r!==u&&a!==u&&n.removeChild(u)}n.removeAttribute("data-loaded"),a?this.annotationLayer.hide():this.annotationLayer&&(this.annotationLayer.cancel(),this.annotationLayer=null),r||(this.canvas&&(this.paintedViewportMap.delete(this.canvas),this.canvas.width=0,this.canvas.height=0,delete this.canvas),this._resetZoomLayer()),this.svg&&(this.paintedViewportMap.delete(this.svg),delete this.svg),this.loadingIconDiv=document.createElement("div"),this.loadingIconDiv.className="loadingIcon",n.appendChild(this.loadingIconDiv)}},{key:"update",value:function(e,t){this.scale=e||this.scale,void 0!==t&&(this.rotation=t);var n=(this.rotation+this.pdfPageRotate)%360;if(this.viewport=this.viewport.clone({scale:this.scale*a.CSS_UNITS,rotation:n}),this.svg)return this.cssTransform(this.svg,!0),void this.eventBus.dispatch("pagerendered",{source:this,pageNumber:this.id,cssTransform:!0,timestamp:performance.now()});var i=!1;if(this.canvas&&this.maxCanvasPixels>0){var r=this.outputScale;(Math.floor(this.viewport.width)*r.sx|0)*(Math.floor(this.viewport.height)*r.sy|0)>this.maxCanvasPixels&&(i=!0)}if(this.canvas){if(this.useOnlyCssZoom||this.hasRestrictedScaling&&i)return this.cssTransform(this.canvas,!0),void this.eventBus.dispatch("pagerendered",{source:this,pageNumber:this.id,cssTransform:!0,timestamp:performance.now()});this.zoomLayer||this.canvas.hasAttribute("hidden")||(this.zoomLayer=this.canvas.parentNode,this.zoomLayer.style.position="absolute")}this.zoomLayer&&this.cssTransform(this.zoomLayer.firstChild),this.reset(!0,!0)}},{key:"cancelRendering",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.paintTask&&(this.paintTask.cancel(),this.paintTask=null),this.resume=null,this.textLayer&&(this.textLayer.cancel(),this.textLayer=null),!e&&this.annotationLayer&&(this.annotationLayer.cancel(),this.annotationLayer=null)}},{key:"cssTransform",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.viewport.width,i=this.viewport.height,r=this.div;e.style.width=e.parentNode.style.width=r.style.width=Math.floor(n)+"px",e.style.height=e.parentNode.style.height=r.style.height=Math.floor(i)+"px";var a=this.viewport.rotation-this.paintedViewportMap.get(e).rotation,o=Math.abs(a),s=1,u=1;90!==o&&270!==o||(s=i/n,u=n/i);var l="rotate("+a+"deg) scale("+s+","+u+")";if(e.style.transform=l,this.textLayer){var c=this.textLayer.viewport,d=this.viewport.rotation-c.rotation,h=Math.abs(d),f=n/c.width;90!==h&&270!==h||(f=n/c.height);var p,v,g=this.textLayer.textLayerDiv;switch(h){case 0:p=v=0;break;case 90:p=0,v="-"+g.style.height;break;case 180:p="-"+g.style.width,v="-"+g.style.height;break;case 270:p="-"+g.style.width,v=0;break;default:console.error("Bad rotation value.")}g.style.transform="rotate("+h+"deg) scale("+f+", "+f+") translate("+p+", "+v+")",g.style.transformOrigin="0% 0%"}t&&this.annotationLayer&&this.annotationLayer.render(this.viewport,"display")}},{key:"getPagePoint",value:function(e,t){return this.viewport.convertToPdfPoint(e,t)}},{key:"draw",value:function(){var e=this;this.renderingState!==s.RenderingStates.INITIAL&&(console.error("Must be in new state before drawing"),this.reset());var t=this.div,n=this.pdfPage;if(!n)return this.renderingState=s.RenderingStates.FINISHED,this.loadingIconDiv&&(t.removeChild(this.loadingIconDiv),delete this.loadingIconDiv),Promise.reject(new Error("pdfPage is not loaded"));this.renderingState=s.RenderingStates.RUNNING;var i=document.createElement("div");i.style.width=t.style.width,i.style.height=t.style.height,i.classList.add("canvasWrapper"),this.annotationLayer&&this.annotationLayer.div?t.insertBefore(i,this.annotationLayer.div):t.appendChild(i);var l=null;if(this.textLayerMode!==a.TextLayerMode.DISABLE&&this.textLayerFactory){var c=document.createElement("div");c.className="textLayer",c.style.width=i.style.width,c.style.height=i.style.height,this.annotationLayer&&this.annotationLayer.div?t.insertBefore(c,this.annotationLayer.div):t.appendChild(c),l=this.textLayerFactory.createTextLayerBuilder(c,this.id-1,this.viewport,this.textLayerMode===a.TextLayerMode.ENABLE_ENHANCE,this.eventBus)}this.textLayer=l;var d=null;this.renderingQueue&&(d=function(t){if(!e.renderingQueue.isHighestPriority(e))return e.renderingState=s.RenderingStates.PAUSED,void(e.resume=function(){e.renderingState=s.RenderingStates.RUNNING,t()});t()});var h=function(){var i,a=(i=r.default.mark(function i(a){return r.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:if(f===e.paintTask&&(e.paintTask=null),!(a instanceof o.RenderingCancelledException)){i.next=4;break}return e.error=null,i.abrupt("return");case 4:if(e.renderingState=s.RenderingStates.FINISHED,e.loadingIconDiv&&(t.removeChild(e.loadingIconDiv),delete e.loadingIconDiv),e._resetZoomLayer(!0),e.error=a,e.stats=n.stats,e.eventBus.dispatch("pagerendered",{source:e,pageNumber:e.id,cssTransform:!1,timestamp:performance.now()}),!a){i.next=12;break}throw a;case 12:case"end":return i.stop()}},i)}),function(){var e=this,t=arguments;return new Promise(function(n,r){var a=i.apply(e,t);function o(e){u(a,n,r,o,s,"next",e)}function s(e){u(a,n,r,o,s,"throw",e)}o(void 0)})});return function(e){return a.apply(this,arguments)}}(),f=this.renderer===a.RendererType.SVG?this.paintOnSvg(i):this.paintOnCanvas(i);f.onRenderContinue=d,this.paintTask=f;var p=f.promise.then(function(){return h(null).then(function(){if(l){var e=n.streamTextContent({normalizeWhitespace:!0});l.setTextContentStream(e),l.render()}})},function(e){return h(e)});return this.annotationLayerFactory&&(this.annotationLayer||(this.annotationLayer=this.annotationLayerFactory.createAnnotationLayerBuilder(t,n,this.imageResourcesPath,this.renderInteractiveForms,this.l10n)),this.annotationLayer.render(this.viewport,"display")),t.setAttribute("data-loaded",!0),this.eventBus.dispatch("pagerender",{source:this,pageNumber:this.id}),p}},{key:"paintOnCanvas",value:function(e){var t=(0,o.createPromiseCapability)(),n={promise:t.promise,onRenderContinue:function(e){e()},cancel:function(){m.cancel()}},i=this.viewport,r=document.createElement("canvas");this.l10n.get("page_canvas",{page:this.id},"Page {{page}}").then(function(e){r.setAttribute("aria-label",e)}),r.setAttribute("hidden","hidden");var s=!0,u=function(){s&&(r.removeAttribute("hidden"),s=!1)};e.appendChild(r),this.canvas=r,r.mozOpaque=!0;var l=r.getContext("2d",{alpha:!1}),c=(0,a.getOutputScale)(l);if(this.outputScale=c,this.useOnlyCssZoom){var d=i.clone({scale:a.CSS_UNITS});c.sx*=d.width/i.width,c.sy*=d.height/i.height,c.scaled=!0}if(this.maxCanvasPixels>0){var h=i.width*i.height,f=Math.sqrt(this.maxCanvasPixels/h);c.sx>f||c.sy>f?(c.sx=f,c.sy=f,c.scaled=!0,this.hasRestrictedScaling=!0):this.hasRestrictedScaling=!1}var p=(0,a.approximateFraction)(c.sx),v=(0,a.approximateFraction)(c.sy);r.width=(0,a.roundToDivide)(i.width*c.sx,p[0]),r.height=(0,a.roundToDivide)(i.height*c.sy,v[0]),r.style.width=(0,a.roundToDivide)(i.width,p[1])+"px",r.style.height=(0,a.roundToDivide)(i.height,v[1])+"px",this.paintedViewportMap.set(r,i);var g={canvasContext:l,transform:c.scaled?[c.sx,0,0,c.sy,0,0]:null,viewport:this.viewport,enableWebGL:this.enableWebGL,renderInteractiveForms:this.renderInteractiveForms},m=this.pdfPage.render(g);return m.onContinue=function(e){u(),n.onRenderContinue?n.onRenderContinue(e):e()},m.promise.then(function(){u(),t.resolve(void 0)},function(e){u(),t.reject(e)}),n}},{key:"paintOnSvg",value:function(e){var t=this,n=!1,i=function(){if(n)throw new o.RenderingCancelledException("Rendering cancelled, page ".concat(t.id),"svg")},r=this.pdfPage,u=this.viewport.clone({scale:a.CSS_UNITS});return{promise:r.getOperatorList().then(function(n){return i(),new o.SVGGraphics(r.commonObjs,r.objs).getSVG(n,u).then(function(n){i(),t.svg=n,t.paintedViewportMap.set(n,u),n.style.width=e.style.width,n.style.height=e.style.height,t.renderingState=s.RenderingStates.FINISHED,e.appendChild(n)})}),onRenderContinue:function(e){e()},cancel:function(){n=!0}}}},{key:"setPageLabel",value:function(e){this.pageLabel="string"==typeof e?e:null,null!==this.pageLabel?this.div.setAttribute("data-page-label",this.pageLabel):this.div.removeAttribute("data-page-label")}},{key:"width",get:function(){return this.viewport.width}},{key:"height",get:function(){return this.viewport.height}}])&&l(t.prototype,n),i&&l(t,i),e}();t.PDFPageView=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultTextLayerFactory=t.TextLayerBuilder=void 0;var i=n(8);function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0;if((this.textContent||this.textContentStream)&&!this.renderingDone){this.cancel(),this.textDivs=[];var n=document.createDocumentFragment();this.textLayerRenderTask=(0,i.renderTextLayer)({textContent:this.textContent,textContentStream:this.textContentStream,container:n,viewport:this.viewport,textDivs:this.textDivs,textContentItemsStr:this.textContentItemsStr,timeout:t,enhanceTextSelection:this.enhanceTextSelection}),this.textLayerRenderTask.promise.then(function(){e.textLayerDiv.appendChild(n),e._finishRendering(),e._updateMatches()},function(e){}),this._onUpdateTextLayerMatches||(this._onUpdateTextLayerMatches=function(t){t.pageIndex!==e.pageIdx&&-1!==t.pageIndex||e._updateMatches()},this.eventBus._on("updatetextlayermatches",this._onUpdateTextLayerMatches))}}},{key:"cancel",value:function(){this.textLayerRenderTask&&(this.textLayerRenderTask.cancel(),this.textLayerRenderTask=null),this._onUpdateTextLayerMatches&&(this.eventBus._off("updatetextlayermatches",this._onUpdateTextLayerMatches),this._onUpdateTextLayerMatches=null)}},{key:"setTextContentStream",value:function(e){this.cancel(),this.textContentStream=e}},{key:"setTextContent",value:function(e){this.cancel(),this.textContent=e}},{key:"_convertMatches",value:function(e,t){if(!e)return[];for(var n=this.findController,i=this.textContentItemsStr,r=0,a=0,o=i.length-1,s=n.state.query.length,u=[],l=0,c=e.length;l=a+i[r].length;)a+=i[r].length,r++;r===i.length&&console.error("Could not find a matching mapping");var h={begin:{divIdx:r,offset:d-a}};for(d+=t?t[l]:s;r!==o&&d>a+i[r].length;)a+=i[r].length,r++;h.end={divIdx:r,offset:d-a},u.push(h)}return u}},{key:"_renderMatches",value:function(e){if(0!==e.length){var t=this.findController,n=this.pageIdx,i=this.textContentItemsStr,r=this.textDivs,a=n===t.selected.pageIdx,o=t.selected.matchIdx,s=null,u={divIdx:-1,offset:void 0},l=o,c=l+1;if(t.state.highlightAll)l=0,c=e.length;else if(!a)return;for(var d=l;d3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4?arguments[4]:void 0;return new s({textLayerDiv:e,pageIndex:t,viewport:n,enhanceTextSelection:i,eventBus:r})}}]),e}();t.DefaultTextLayerFactory=u},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SecondaryToolbar=void 0;var i=n(5),r=n(9),a=n(33);function o(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,u=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){u=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(u)throw a}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n=this.pagesCount,this.items.pageRotateCw.disabled=0===this.pagesCount,this.items.pageRotateCcw.disabled=0===this.pagesCount}},{key:"_bindClickListeners",value:function(){var e=this;this.toggleButton.addEventListener("click",this.toggle.bind(this));var t,n=o(this.buttons);try{var i=function(){var n=t.value,i=n.element,r=n.eventName,a=n.close,o=n.eventDetails;i.addEventListener("click",function(t){if(null!==r){var n={source:e};for(var i in o)n[i]=o[i];e.eventBus.dispatch(r,n)}a&&e.close()})};for(n.s();!(t=n.n()).done;)i()}catch(e){n.e(e)}finally{n.f()}}},{key:"_bindCursorToolsListener",value:function(e){this.eventBus._on("cursortoolchanged",function(t){var n=t.tool;e.cursorSelectToolButton.classList.toggle("toggled",n===r.CursorTool.SELECT),e.cursorHandToolButton.classList.toggle("toggled",n===r.CursorTool.HAND)})}},{key:"_bindScrollModeListener",value:function(e){var t=this;function n(t){var n=t.mode;e.scrollVerticalButton.classList.toggle("toggled",n===i.ScrollMode.VERTICAL),e.scrollHorizontalButton.classList.toggle("toggled",n===i.ScrollMode.HORIZONTAL),e.scrollWrappedButton.classList.toggle("toggled",n===i.ScrollMode.WRAPPED);var r=n===i.ScrollMode.HORIZONTAL;e.spreadNoneButton.disabled=r,e.spreadOddButton.disabled=r,e.spreadEvenButton.disabled=r}this.eventBus._on("scrollmodechanged",n),this.eventBus._on("secondarytoolbarreset",function(e){e.source===t&&n({mode:i.ScrollMode.VERTICAL})})}},{key:"_bindSpreadModeListener",value:function(e){var t=this;function n(t){var n=t.mode;e.spreadNoneButton.classList.toggle("toggled",n===i.SpreadMode.NONE),e.spreadOddButton.classList.toggle("toggled",n===i.SpreadMode.ODD),e.spreadEvenButton.classList.toggle("toggled",n===i.SpreadMode.EVEN)}this.eventBus._on("spreadmodechanged",n),this.eventBus._on("secondarytoolbarreset",function(e){e.source===t&&n({mode:i.SpreadMode.NONE})})}},{key:"open",value:function(){this.opened||(this.opened=!0,this._setMaxHeight(),this.toggleButton.classList.add("toggled"),this.toolbar.classList.remove("hidden"))}},{key:"close",value:function(){this.opened&&(this.opened=!1,this.toolbar.classList.add("hidden"),this.toggleButton.classList.remove("toggled"))}},{key:"toggle",value:function(){this.opened?this.close():this.open()}},{key:"_setMaxHeight",value:function(){this.opened&&(this.containerHeight=this.mainContainer.clientHeight,this.containerHeight!==this.previousContainerHeight&&(this.toolbarButtonContainer.style.maxHeight="".concat(this.containerHeight-i.SCROLLBAR_PADDING,"px"),this.previousContainerHeight=this.containerHeight))}},{key:"isOpen",get:function(){return this.opened}}])&&u(t.prototype,n),s&&u(t,s),e}();t.SecondaryToolbar=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PDFSinglePageViewer=void 0;var i=n(28),r=n(8);function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){for(var n=0;n=this._previousPageNumber;this._ensurePageViewVisible(),this.update(),s(c(h.prototype),"_scrollIntoView",this).call(this,{pageDiv:n,pageSpot:r,pageNumber:o}),this._updateScrollDown=function(){t.scroll.down=u,t._updateScrollDown=null}}},{key:"_getVisiblePages",value:function(){return this._getCurrentVisiblePage()}},{key:"_updateHelper",value:function(e){}},{key:"_updateScrollMode",value:function(){}},{key:"_updateSpreadMode",value:function(){}},{key:"_viewerElement",get:function(){return(0,r.shadow)(this,"_viewerElement",this._shadowViewer)}},{key:"_isScrollModeHorizontal",get:function(){return(0,r.shadow)(this,"_isScrollModeHorizontal",!1)}}])&&o(t.prototype,n),a&&o(t,a),h}();t.PDFSinglePageViewer=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Toolbar=void 0;var i,r=(i=n(2))&&i.__esModule?i:{default:i},a=n(5);function o(e,t,n,i,r,a,o){try{var s=e[a](o),u=s.value}catch(e){return void n(e)}s.done?t(u):Promise.resolve(u).then(i,r)}function s(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n2&&void 0!==arguments[2]?arguments[2]:a.NullL10n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.toolbar=t.container,this.eventBus=n,this.l10n=i,this.buttons=[{element:t.previous,eventName:"previouspage"},{element:t.next,eventName:"nextpage"},{element:t.zoomIn,eventName:"zoomin"},{element:t.zoomOut,eventName:"zoomout"},{element:t.openFile,eventName:"openfile"},{element:t.print,eventName:"print"},{element:t.presentationModeButton,eventName:"presentationmode"},{element:t.download,eventName:"download"},{element:t.viewBookmark,eventName:null}],this.items={numPages:t.numPages,pageNumber:t.pageNumber,scaleSelectContainer:t.scaleSelectContainer,scaleSelect:t.scaleSelect,customScaleOption:t.customScaleOption,previous:t.previous,next:t.next,zoomIn:t.zoomIn,zoomOut:t.zoomOut},this._wasLocalized=!1,this.reset(),this._bindListeners()}var t,n,i;return t=e,(n=[{key:"setPageNumber",value:function(e,t){this.pageNumber=e,this.pageLabel=t,this._updateUIState(!1)}},{key:"setPagesCount",value:function(e,t){this.pagesCount=e,this.hasPageLabels=t,this._updateUIState(!0)}},{key:"setPageScale",value:function(e,t){this.pageScaleValue=(e||t).toString(),this.pageScale=t,this._updateUIState(!1)}},{key:"reset",value:function(){this.pageNumber=0,this.pageLabel=null,this.hasPageLabels=!1,this.pagesCount=0,this.pageScaleValue=a.DEFAULT_SCALE_VALUE,this.pageScale=a.DEFAULT_SCALE,this._updateUIState(!0),this.updateLoadingIndicatorState()}},{key:"_bindListeners",value:function(){var e,t=this,n=this.items,i=n.pageNumber,r=n.scaleSelect,o=this,u=s(this.buttons);try{var l=function(){var n=e.value,i=n.element,r=n.eventName;i.addEventListener("click",function(e){null!==r&&t.eventBus.dispatch(r,{source:t})})};for(u.s();!(e=u.n()).done;)l()}catch(e){u.e(e)}finally{u.f()}i.addEventListener("click",function(){this.select()}),i.addEventListener("change",function(){o.eventBus.dispatch("pagenumberchanged",{source:o,value:this.value})}),r.addEventListener("change",function(){"custom"!==this.value&&o.eventBus.dispatch("scalechanged",{source:o,value:this.value})}),r.oncontextmenu=a.noContextMenuHandler,this.eventBus._on("localized",function(){t._wasLocalized=!0,t._adjustScaleWidth(),t._updateUIState(!0)})}},{key:"_updateUIState",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this._wasLocalized){var t=this.pageNumber,n=this.pagesCount,i=this.pageScaleValue,r=this.pageScale,o=this.items;e&&(this.hasPageLabels?o.pageNumber.type="text":(o.pageNumber.type="number",this.l10n.get("of_pages",{pagesCount:n},"of {{pagesCount}}").then(function(e){o.numPages.textContent=e})),o.pageNumber.max=n),this.hasPageLabels?(o.pageNumber.value=this.pageLabel,this.l10n.get("page_of_pages",{pageNumber:t,pagesCount:n},"({{pageNumber}} of {{pagesCount}})").then(function(e){o.numPages.textContent=e})):o.pageNumber.value=t,o.previous.disabled=t<=1,o.next.disabled=t>=n,o.zoomOut.disabled=r<=a.MIN_SCALE,o.zoomIn.disabled=r>=a.MAX_SCALE;var u=Math.round(1e4*r)/100;this.l10n.get("page_scale_percent",{scale:u},"{{scale}}%").then(function(e){var t,n=!1,r=s(o.scaleSelect.options);try{for(r.s();!(t=r.n()).done;){var a=t.value;a.value===i?(a.selected=!0,n=!0):a.selected=!1}}catch(e){r.e(e)}finally{r.f()}n||(o.customScaleOption.textContent=e,o.customScaleOption.selected=!0)})}}},{key:"updateLoadingIndicatorState",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.items.pageNumber.classList.toggle("visiblePageIsLoading",e)}},{key:"_adjustScaleWidth",value:function(){var e,t=(e=r.default.mark(function e(){var t,n,i,o,u,l,c,d,h,f,p,v,g,m;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.items,n=this.l10n,i=Promise.all([n.get("page_scale_auto",null,"Automatic Zoom"),n.get("page_scale_actual",null,"Actual Size"),n.get("page_scale_fit",null,"Page Fit"),n.get("page_scale_width",null,"Page Width")]),(o=document.createElement("canvas")).mozOpaque=!0,u=o.getContext("2d",{alpha:!1}),e.next=7,a.animationStarted;case 7:return l=getComputedStyle(t.scaleSelect),c=l.fontSize,d=l.fontFamily,u.font="".concat(c," ").concat(d),h=0,e.t0=s,e.next=13,i;case 13:e.t1=e.sent,f=(0,e.t0)(e.t1);try{for(f.s();!(p=f.n()).done;)v=p.value,g=u.measureText(v),(m=g.width)>h&&(h=m)}catch(e){f.e(e)}finally{f.f()}22,(h+=33)>140&&(t.scaleSelect.style.width="".concat(h+22,"px"),t.scaleSelectContainer.style.width="".concat(h,"px")),o.width=0,o.height=0,o=u=null;case 22:case"end":return e.stop()}},e,this)}),function(){var t=this,n=arguments;return new Promise(function(i,r){var a=e.apply(t,n);function s(e){o(a,i,r,s,u,"next",e)}function u(e){o(a,i,r,s,u,"throw",e)}s(void 0)})});return function(){return t.apply(this,arguments)}}()}])&&l(t.prototype,n),i&&l(t,i),e}();t.Toolbar=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ViewHistory=void 0;var i,r=(i=n(2))&&i.__esModule?i:{default:i};function a(e,t,n,i,r,a,o){try{var s=e[a](o),u=s.value}catch(e){return void n(e)}s.done?t(u):Promise.resolve(u).then(i,r)}function o(e){return function(){var t=this,n=arguments;return new Promise(function(i,r){var o=e.apply(t,n);function s(e){a(o,i,r,s,u,"next",e)}function u(e){a(o,i,r,s,u,"throw",e)}s(void 0)})}}function s(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:u;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.fingerprint=t,this.cacheSize=i,this._initializedPromise=this._readFromStorage().then(function(e){var t=JSON.parse(e||"{}"),i=-1;if(Array.isArray(t.files)){for(;t.files.length>=n.cacheSize;)t.files.shift();for(var r=0,a=t.files.length;r0?(r=t.substring(0,s),o=t.substring(s+1)):(r=t,o=a),i[r]||(i[r]={}),i[r][o]=e[t]}n&&n()})},o)}function h(e,n){e&&(e=e.toLowerCase()),n=n||function(){},i={},r="",o="",o=e;var a=t.querySelectorAll('link[type="application/l10n"]'),s=a.length;if(0!==s){var l,c,h=0;c=function(){++h>=s&&(n(),u="complete")};for(var f=0;f0&&(o=e.substring(r+1),e=e.substring(0,r)),n&&((i={})[o]=n);var s=f(e,t,i);return s&&o in s?s[o]:"{{"+e+"}}"},getData:function(){return i},getText:function(){return r},getLanguage:function(){return o},setLanguage:function(e,t){h(e,function(){t&&t()})},getDirection:function(){var e=o.split("-",1)[0];return["ar","he","fa","ps","ur"].indexOf(e)>=0?"rtl":"ltr"},translate:function(e){for(var n=function(e){return e?e.querySelectorAll("*[data-l10n-id]"):[]}(e=e||t.documentElement),i=n.length,r=0;r=t)return f(t,t,e.l10n),void r();var u=e.currentPage;f(u,t,e.l10n),function(e,t,n,r){var s=o.scratchCanvas,u=(a.AppOptions.get("printResolution")||150)/72;s.width=Math.floor(r.width*u),s.height=Math.floor(r.height*u);var l=Math.floor(r.width*i.CSS_UNITS)+"px",c=Math.floor(r.height*i.CSS_UNITS)+"px",d=s.getContext("2d");return d.save(),d.fillStyle="rgb(255, 255, 255)",d.fillRect(0,0,s.width,s.height),d.restore(),t.getPage(n).then(function(e){var t={canvasContext:d,transform:[u,0,0,u,0,0],viewport:e.getViewport({scale:1,rotation:r.rotation}),intent:"print"};return e.render(t).promise}).then(function(){return{width:l,height:c}})}(0,e.pdfDocument,u+1,e.pagesOverview[u]).then(e.useRenderedPage.bind(e)).then(function(){n(r,s)},s)})},useRenderedPage:function(e){this.throwIfInactive();var t=document.createElement("img");t.style.width=e.width,t.style.height=e.height;var n=this.scratchCanvas;"toBlob"in n&&!this.disableCreateObjectURL?n.toBlob(function(e){t.src=URL.createObjectURL(e)}):t.src=n.toDataURL();var i=document.createElement("div");return i.appendChild(t),this.printContainer.appendChild(i),new Promise(function(e,n){t.onload=e,t.onerror=n})},performPrint:function(){var e=this;return this.throwIfInactive(),new Promise(function(t){setTimeout(function(){e.active?(c.call(window),setTimeout(t,20)):t()},0)})},get active(){return this===o},throwIfInactive:function(){if(!this.active)throw new Error("This print request was cancelled or completed.")}};var l,c=window.print;function d(e){var t=document.createEvent("CustomEvent");t.initCustomEvent(e,!1,!1,"custom"),window.dispatchEvent(t)}function h(){o&&(o.destroy(),d("afterprint"))}function f(e,t,n){var i=document.getElementById("printServiceOverlay"),r=Math.round(100*e/t),a=i.querySelector("progress"),o=i.querySelector(".relative-progress");a.value=r,n.get("print_progress_percent",{progress:r},r+"%").then(function(e){o.textContent=e})}if(window.print=function(){if(o)console.warn("Ignored window.print() because of a pending print job.");else{v().then(function(){o&&s.open("printServiceOverlay")});try{d("beforeprint")}finally{if(!o)return console.error("Expected print service to be initialized."),void v().then(function(){"printServiceOverlay"===s.active&&s.close("printServiceOverlay")});var e=o;o.renderPages().then(function(){return e.performPrint()}).catch(function(){}).then(function(){e.active&&h()})}}},window.addEventListener("keydown",function(e){80!==e.keyCode||!e.ctrlKey&&!e.metaKey||e.altKey||e.shiftKey&&!window.chrome&&!window.opera||(window.print(),e.preventDefault(),e.stopImmediatePropagation?e.stopImmediatePropagation():e.stopPropagation())},!0),"onbeforeprint"in window){var p=function(e){"custom"!==e.detail&&e.stopImmediatePropagation&&e.stopImmediatePropagation()};window.addEventListener("beforeprint",p),window.addEventListener("afterprint",p)}function v(){if(!l){if(!(s=r.PDFViewerApplication.overlayManager))throw new Error("The overlay manager has not yet been initialized.");l=s.register("printServiceOverlay",document.getElementById("printServiceOverlay"),h,!0),document.getElementById("printCancel").onclick=h}return l}r.PDFPrintServiceFactory.instance={supportsPrinting:!0,createPrintService:function(e,t,n,i){if(o)throw new Error("The print service is created and active.");return o=new u(e,t,n,i)}}}]); \ No newline at end of file diff --git a/public/workspace/content/assets/replay.svg b/public/workspace/content/assets/replay.svg deleted file mode 100644 index e8145a0..0000000 --- a/public/workspace/content/assets/replay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/rotate-icon.svg b/public/workspace/content/assets/rotate-icon.svg deleted file mode 100644 index b57d511..0000000 --- a/public/workspace/content/assets/rotate-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/timer.svg b/public/workspace/content/assets/timer.svg deleted file mode 100644 index 244b941..0000000 --- a/public/workspace/content/assets/timer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/workspace/content/assets/user.svg b/public/workspace/content/assets/user.svg deleted file mode 100644 index 4d6dafd..0000000 --- a/public/workspace/content/assets/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/players/SunbirdEpubPlayer.tsx b/src/components/players/SunbirdEpubPlayer.tsx index 7447a78..77cbf25 100644 --- a/src/components/players/SunbirdEpubPlayer.tsx +++ b/src/components/players/SunbirdEpubPlayer.tsx @@ -28,7 +28,7 @@ const SunbirdEpubPlayer = ({ playerConfig }: PlayerConfigProps) => { const handlePlayerEvent = (event: any) => { console.log("Player Event", event.detail); - if (event?.detail?.type === "EXIT") { + if (event?.detail?.edata?.type === "EXIT") { handleExitEvent(); } }; From 037b97da13f8d256ef8a7e35b97f4f9f90a279a6 Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Wed, 6 Nov 2024 17:50:27 +0530 Subject: [PATCH 024/126] Issue #2195 feat: Use admin app authorisation token in workspace --- src/pages/api/proxy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index ecbc948..8396dc2 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -6,7 +6,7 @@ import { genericEditorReviewFormResponse, genericEditorRequestForChangesFormResponse, } from "./mocked-response"; -import cookie from "cookie"; +const cookie = require("cookie"); export default async function handler( req: NextApiRequest, @@ -21,7 +21,7 @@ export default async function handler( const cookies = cookie.parse(req.headers.cookie || ""); - console.log(cookies); + console.log(cookies.authToken); const token = cookies.authToken || API_KEY; From 3dc1b09f0ee953095377d7a4fb50f01cb42f2f84 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Wed, 6 Nov 2024 19:01:27 +0530 Subject: [PATCH 025/126] Issue #PS-2345 feat: Integration of V1 Content Player in Admin app --- src/pages/sunbirdPlayers.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pages/sunbirdPlayers.tsx b/src/pages/sunbirdPlayers.tsx index 137986b..ca83ff1 100644 --- a/src/pages/sunbirdPlayers.tsx +++ b/src/pages/sunbirdPlayers.tsx @@ -28,6 +28,13 @@ const SunbirdQuMLPlayer = dynamic( } ); +const SunbirdV1Player = dynamic( + () => import("@/components/V1-Player/V1Player"), + { + ssr: false, + } +); + interface PlayerProps { "player-config": any; identifier: string; @@ -46,6 +53,10 @@ const SunbirdPlayers = ({ "player-config": playerConfig }: PlayerProps) => { return ; case "application/epub": return ; + case "application/vnd.ekstep.h5p-archive": + return ; + case "application/vnd.ekstep.html-archive": + return ; default: return
Unsupported media type
; } From d7b424d1dd9db1779b6ef0cfeee3aa24d3f6b8d2 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Thu, 7 Nov 2024 12:34:48 +0530 Subject: [PATCH 026/126] Issue #PS-0000 fix: Fixed authtoken issue --- src/pages/api/proxy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index 8396dc2..b602c84 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -21,9 +21,9 @@ export default async function handler( const cookies = cookie.parse(req.headers.cookie || ""); - console.log(cookies.authToken); + console.log(cookies?.authToken); - const token = cookies.authToken || API_KEY; + const token = cookies?.authToken || API_KEY; if (!token) { console.error("No valid token available"); From 1c0a1302c099fb5a5107d7061952ce6a605c10be Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Thu, 7 Nov 2024 12:58:02 +0530 Subject: [PATCH 027/126] Issue #PS-0000 fix: Fixed json parse issue --- src/services/ContentService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index 25ea1eb..845fbb1 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -55,7 +55,7 @@ const getReqBodyWithStatus = ( ) => { if (typeof window !== "undefined" && typeof localStorage !== "undefined") { var PrimaryCategory = JSON.parse( - localStorage.getItem("PrimaryCategory") || "" + localStorage.getItem("PrimaryCategory") as string ); } primaryCategory = From 63436eb7b40adaa22e247c8bbf9ed3660c57b95f Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Thu, 7 Nov 2024 14:38:47 +0530 Subject: [PATCH 028/126] Issue #2195 feat: Use admin app authorisation token in workspace --- src/pages/api/proxy.ts | 2 +- src/pages/workspace/content/create/index.tsx | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index 8396dc2..953f7cb 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -6,7 +6,7 @@ import { genericEditorReviewFormResponse, genericEditorRequestForChangesFormResponse, } from "./mocked-response"; -const cookie = require("cookie"); +import * as cookie from "cookie"; export default async function handler( req: NextApiRequest, diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 42da9d4..5abc89a 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -7,20 +7,24 @@ import DescriptionOutlinedIcon from "@mui/icons-material/DescriptionOutlined"; import UploadIcon from "@mui/icons-material/Upload"; import { useRouter } from "next/router"; import { createCourse, createQuestionSet } from "@/services/ContentService"; -import axios from "axios"; const CreatePage = () => { const theme = useTheme(); const [selectedKey, setSelectedKey] = useState("create"); const router = useRouter(); + useEffect(() => { + const token = localStorage.getItem("token"); + const userId = localStorage.getItem("userId"); + + if (token && userId) { + document.cookie = `authToken=${token}; path=/; secure; SameSite=Strict`; + document.cookie = `userId=${userId}; path=/; secure; SameSite=Strict`; + } + }, []); + const fetchData = async () => { try { - const token = localStorage.getItem("token"); - if (token) { - document.cookie = `authToken=${token}; path=/; secure; SameSite=Strict`; - } - const response = await createQuestionSet(); console.log("Question set created successfully:", response); From 7ebc97c4cbaaff7aa32db3a85e775dbd98e6c72c Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Thu, 7 Nov 2024 18:26:40 +0530 Subject: [PATCH 029/126] Issue #PS-0000 fix: testing --- src/pages/workspace/content/create/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 42da9d4..d81dfe4 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -97,7 +97,7 @@ const CreatePage = () => { fontSize={"16px"} sx={{ color: theme.palette.warning["100"] }} > - Here you can create new content. + Here you can create new content.... From 92a507a86f09237598ebfe27c28dda102f5a6bec Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Thu, 7 Nov 2024 19:41:55 +0530 Subject: [PATCH 030/126] Issue #PS-2195 feat: Using admin auth token for file upload --- src/pages/api/fileUpload.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/api/fileUpload.ts b/src/pages/api/fileUpload.ts index 153c605..4b22b75 100644 --- a/src/pages/api/fileUpload.ts +++ b/src/pages/api/fileUpload.ts @@ -2,6 +2,7 @@ import multer, { MulterError } from 'multer'; import FormData from 'form-data'; import axios from 'axios'; import type { NextApiRequest, NextApiResponse } from 'next'; +const cookie = require("cookie"); const upload = multer({ limits: { @@ -46,6 +47,7 @@ const uploadPromise = (req: NextApiRequest, res: NextApiResponse) => { // Main handler function for Next.js API route export default async function handler(req: NextApiRequest, res: NextApiResponse) { + // Handle only POST requests if (req.method !== 'POST') { return res.status(405).json({ message: 'Method not allowed' }); @@ -79,11 +81,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } } + const cookies = cookie.parse(req.headers.cookie || ""); + // Set your base URL const baseURL = process.env.BASE_URL as string; - const authApiToken = process.env.AUTH_API_TOKEN as string; + const authApiToken = cookies?.authToken || process.env.AUTH_API_TOKEN; const tenantId = process.env.TENANT_ID as string; + console.log("Using token for file upload:", authApiToken); + // Extract the relative URL from the incoming request (after /action) const relativePath = req.url?.replace('/api/fileUpload', '') ?? ''; From bcca2781e2f279368186cce689fd009598e8c0c1 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Fri, 8 Nov 2024 11:00:59 +0530 Subject: [PATCH 031/126] Issue #PS-0000 fix: testing --- src/pages/api/proxy.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index ffd7c4f..30e998d 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -84,8 +84,11 @@ export default async function handler( : {}), }; + console.log("options =====>", options); const response = await fetch(targetUrl, options); + console.log("response =====>", response); const data = await response.json(); + console.log("data =====>", data); res.status(response.status).json(data); } catch (error: any) { console.error("Error in proxy:", error.message); From dc873d693a1120be31a9a74bc2b233513095ed41 Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Fri, 8 Nov 2024 13:11:13 +0530 Subject: [PATCH 032/126] Issue #2330 feat: Remove editor Config hardcoding --- src/components/CollectionEditor.tsx | 28 ++++++++++++++---- src/components/QuestionSetEditor.tsx | 31 +++++++++++++++----- src/pages/workspace/content/create/index.tsx | 4 ++- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index a535e92..484729f 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -1,17 +1,35 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; +import { v4 as uuidv4 } from "uuid"; const CollectionEditor: React.FC = () => { const router = useRouter(); const { identifier } = router.query; + const [fullName, setFullName] = useState("Anonymous"); + const [userId, setUserId] = useState("ef99949b-7f3a-4a5f-806a-e67e683e38f3"); + const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); + + const [firstName, lastName] = fullName.split(" "); + + useEffect(() => { + const storedFullName = localStorage.getItem("name") || "Anonymous"; + const storedUserId = + localStorage.getItem("userId") || "ef99949b-7f3a-4a5f-806a-e67e683e38f3"; + setFullName(storedFullName); + setUserId(storedUserId); + + const generatedDeviceId = uuidv4(); + setDeviceId(generatedDeviceId); + }, []); + const editorConfig = { context: { user: { - id: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", - fullName: "Rahul", - firstName: "Tekdi", - lastName: "Rahul Tekdi", + id: userId, + fullName: fullName, + firstName: firstName || "Anonymous", + lastName: lastName || "Anonymous", orgIds: ["01309282781705830427"], }, identifier: identifier, @@ -19,7 +37,7 @@ const CollectionEditor: React.FC = () => { framework: "test_k12_framework", authToken: " ", sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", - did: "7e85b4967aebd6704ba1f604f20056b6", + did: deviceId, uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", additionalCategories: [ { diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index 3d5dc8f..294592c 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -1,25 +1,43 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; +import { v4 as uuidv4 } from "uuid"; const QuestionSetEditor: React.FC = () => { const router = useRouter(); const { identifier, mode } = router.query; + const [fullName, setFullName] = useState("Anonymous"); + const [userId, setUserId] = useState("ef99949b-7f3a-4a5f-806a-e67e683e38f3"); + const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); + + const [firstName, lastName] = fullName.split(" "); + + useEffect(() => { + const storedFullName = localStorage.getItem("name") || "Anonymous"; + const storedUserId = + localStorage.getItem("userId") || "ef99949b-7f3a-4a5f-806a-e67e683e38f3"; + setFullName(storedFullName); + setUserId(storedUserId); + + const generatedDeviceId = uuidv4(); + setDeviceId(generatedDeviceId); + }, []); + const questionSetEditorConfig = { context: { programId: "", contributionOrgId: "", user: { - id: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", - fullName: "Rahul Tekdi", - firstName: "Rahul ", - lastName: "Tekdi", + id: userId, + fullName: fullName, + firstName: firstName || "Anonymous", + lastName: lastName || "Anonymous", orgIds: ["test-k12-channel"], }, identifier: identifier, authToken: " ", sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", - did: "7e85b4967aebd6704ba1f604f20056b6", + did: deviceId, uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", channel: "test-k12-channel", pdata: { @@ -140,8 +158,6 @@ const QuestionSetEditor: React.FC = () => { if (!document.getElementById("sunbird-editor-js")) { const script = document.createElement("script"); - console.log("QUESTIONSET EDITOR"); - script.id = "sunbird-editor-js"; script.src = "https://cdn.jsdelivr.net/npm/@tekdi/sunbird-questionset-editor-web-component@3.0.1/sunbird-questionset-editor.js"; @@ -164,7 +180,6 @@ const QuestionSetEditor: React.FC = () => { }; }, []); - // Initialize the editor only after assets are loaded useEffect(() => { if (assetsLoaded && editorRef.current && !isAppendedRef.current) { const questionsetEditorElement = document.createElement( diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 5abc89a..bbab0a0 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -44,7 +44,9 @@ const CreatePage = () => { const fetchCollectionData = async () => { try { - const userId = "5afb0c71-5e85-46f6-8780-3059cbb7bbf9"; + const userId = + localStorage.getItem("userId") || + "5afb0c71-5e85-46f6-8780-3059cbb7bbf9"; const response = await createCourse(userId); console.log("Course set created successfully:", response); From 58d8658c9b57e824eb1aa91fdec391aab48d7585 Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Sat, 9 Nov 2024 18:42:39 +0530 Subject: [PATCH 033/126] Issue #2322 feat: Workspace UI improvements and Fixes --- src/components/CollectionEditor.tsx | 4 +- src/components/ContentCard.tsx | 4 +- src/components/SideBar.tsx | 42 +++- src/pages/workspace/content/create/index.tsx | 127 +++++++---- src/pages/workspace/content/draft/index.tsx | 199 ++++++++++------- src/pages/workspace/content/publish/index.tsx | 201 +++++++++++------- .../workspace/content/submitted/index.tsx | 200 ++++++++++------- 7 files changed, 506 insertions(+), 271 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 484729f..2789588 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -4,7 +4,7 @@ import { v4 as uuidv4 } from "uuid"; const CollectionEditor: React.FC = () => { const router = useRouter(); - const { identifier } = router.query; + const { identifier, mode } = router.query; const [fullName, setFullName] = useState("Anonymous"); const [userId, setUserId] = useState("ef99949b-7f3a-4a5f-806a-e67e683e38f3"); @@ -84,7 +84,7 @@ const CollectionEditor: React.FC = () => { cloudStorageUrls: ["https://knowlg-public.s3-ap-south-1.amazonaws.com/"], }, config: { - mode: "edit", // edit / review / read / sourcingReview + mode: mode || "edit", // edit / review / read / sourcingReview maxDepth: 4, objectType: "Collection", primaryCategory: "Course", // Professional Development Course, Curriculum Course diff --git a/src/components/ContentCard.tsx b/src/components/ContentCard.tsx index 6a0a05b..ad9b384 100644 --- a/src/components/ContentCard.tsx +++ b/src/components/ContentCard.tsx @@ -45,9 +45,7 @@ const ContentCard: React.FC = ({ {icon} - - {title} - + {title} {/* diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 9042d24..52b8496 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -13,16 +13,30 @@ import { useMediaQuery, } from "@mui/material"; import MenuIcon from "@mui/icons-material/Menu"; -import DatabaseIcon from "@mui/icons-material/Storage"; -import CloseIcon from "@mui/icons-material/Close"; +import StorageIcon from "@mui/icons-material/Storage"; +import CreateIcon from "@mui/icons-material/Create"; +import DraftsIcon from "@mui/icons-material/Drafts"; +import PublishIcon from "@mui/icons-material/Publish"; +import FolderIcon from "@mui/icons-material/Folder"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import CloseIcon from "@mui/icons-material/Close"; +import AddOutlinedIcon from "@mui/icons-material/AddOutlined"; +import CreateOutlinedIcon from "@mui/icons-material/CreateOutlined"; +import PreviewOutlinedIcon from "@mui/icons-material/PreviewOutlined"; +import OutlinedFlagOutlinedIcon from "@mui/icons-material/OutlinedFlagOutlined"; +import AppsOutlinedIcon from "@mui/icons-material/AppsOutlined"; +// Updated menu items with icons const menuItems = [ - { text: "Create Content", key: "create" }, - { text: "All My Contents", key: "allContents" }, - { text: "Draft", key: "draft" }, - { text: "Submitted for Review", key: "submitted" }, - { text: "Publish", key: "publish" }, + { text: "Create", key: "create", icon: }, + { text: "Draft", key: "draft", icon: }, + { + text: "Submitted for Review", + key: "submitted", + icon: , + }, + { text: "Publish", key: "publish", icon: }, + { text: "All My Contents", key: "allContents", icon: }, ]; interface SidebarProps { @@ -69,10 +83,10 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { - Workspace + Back to Main Page {isMobile && ( @@ -109,6 +123,16 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { key={item.key} onClick={() => handleNavigation(item.key)} > + + {item.icon} + ))} diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index bbab0a0..afce382 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -1,15 +1,18 @@ import React, { useEffect, useState } from "react"; import Layout from "../../../../components/Layout"; -import { Typography, Box, useTheme } from "@mui/material"; +import { Typography, Box, useTheme, Paper } from "@mui/material"; import ContentCard from "../../../../components/ContentCard"; import DescriptionIcon from "@mui/icons-material/Description"; import DescriptionOutlinedIcon from "@mui/icons-material/DescriptionOutlined"; import UploadIcon from "@mui/icons-material/Upload"; import { useRouter } from "next/router"; import { createCourse, createQuestionSet } from "@/services/ContentService"; +import QuizOutlinedIcon from "@mui/icons-material/QuizOutlined"; +import SchoolOutlinedIcon from "@mui/icons-material/SchoolOutlined"; +import VideoLibraryOutlinedIcon from "@mui/icons-material/VideoLibraryOutlined"; const CreatePage = () => { - const theme = useTheme(); + const theme = useTheme(); const [selectedKey, setSelectedKey] = useState("create"); const router = useRouter(); @@ -56,7 +59,7 @@ const CreatePage = () => { query: { identifier }, }); } catch (error) { - console.error("Error creating question set:", error); + console.error("Error creating course:", error); } }; @@ -66,62 +69,108 @@ const CreatePage = () => { const cardData = [ { - title: "Upload Content", - description: "You can upload content here.", - icon: , + title: "New Question Set", + description: "Create assessments, question banks, quizzes, etc.", + icon: , + onClick: openEditor, + }, + { + title: "New Course", + description: + "Description about what this is and what the user can create.", + icon: , + onClick: openCollectionEditor, + }, + { + title: "New Content", + description: "Create new documents, PDF, video, QML, HTML, etc.", + icon: , onClick: () => router.push("/upload-editor"), }, { - title: "Upload Large Videos(>50 MB)", - description: "You can upload content here.", - icon: , + title: "New Large Content", + description: "Videos and documents larger than 150 MB", + icon: , onClick: () => router.push({ pathname: "/upload-editor", query: { editorforlargecontent: "true" }, }), }, - { - title: "Question Set", - description: "Create Questionsets", - icon: , - onClick: openEditor, - }, - { - title: "Course", - description: "Design courses using collections and resources.", - icon: , - onClick: openCollectionEditor, - }, ]; return ( - + + + Workspace + + - Here you can create new content. + Create, organize, and manage all types of content in one place. + Whether it's courses, assessments, or any other type of content. + {/* Outer box for "Create new content" heading and cards */} - {cardData.map((card, index) => ( - - ))} + + Create new content + + + + {cardData.map((card, index) => ( + + {card.icon} + + {card.title} + + + {card.description} + + + ))} + ); diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 76d69c6..e8e30b8 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -1,39 +1,40 @@ import React, { useEffect, useMemo, useState } from "react"; import Layout from "../../../../components/Layout"; -import { Typography, Box, TablePagination } from "@mui/material"; -import CourseCard from "../../../../components/CourseCard"; -import SearchBox from "../../../../components/SearchBox"; +import { + Typography, + Box, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + IconButton, + CircularProgress, +} from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; import { getContent } from "@/services/ContentService"; -import Loader from "@/components/Loader"; -import NoDataFound from "@/components/NoDataFound"; +import SearchBox from "../../../../components/SearchBox"; import PaginationComponent from "@/components/PaginationComponent"; +import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; +import { useRouter } from "next/router"; +import { MIME_TYPE } from "@/utils/app.config"; const DraftPage = () => { const [selectedKey, setSelectedKey] = useState("draft"); const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(4); + const [rowsPerPage, setRowsPerPage] = useState(5); const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("updated"); - const [contentList, setContentList] = React.useState([]); + const [contentList, setContentList] = React.useState([]); const [contentDeleted, setContentDeleted] = React.useState(false); const [loading, setLoading] = useState(false); const [totalCount, setTotalCount] = useState(0); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); - const handleChangePage = (event: unknown, newPage: number) => { - setPage(newPage - 1); - }; - - const handleChangeRowsPerPage = ( - event: React.ChangeEvent - ) => { - setRowsPerPage(parseInt(event.target.value, 10)); - setPage(0); - }; - useEffect(() => { const handler = setTimeout(() => { setDebouncedSearchTerm(searchTerm); @@ -56,24 +57,29 @@ const DraftPage = () => { setSortBy(sortBy); }; - const filteredData = useMemo( - () => - contentList?.filter((content) => - content.name.toLowerCase().includes(searchTerm) - ), - [searchTerm] - ); - - // const displayedCards = filteredData?.slice( - // page * rowsPerPage, - // page * rowsPerPage + rowsPerPage - // ); - const handleDelete = (index: number) => { console.log(`Deleting item at index ${index}`); - setTimeout(() => { - setContentDeleted((prev) => !prev); - }, 1000); + setContentDeleted((prev) => !prev); + }; + + const router = useRouter(); + + const openEditor = (content: any) => { + const identifier = content?.identifier; + const mode = content?.mode; + if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { + router.push({ pathname: `/editor`, query: { identifier, mode } }); + } else if ( + content?.mimeType && + MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/upload-editor`, query: { identifier } }); + } else if ( + content?.mimeType && + MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/collection`, query: { identifier, mode } }); + } }; useEffect(() => { @@ -84,9 +90,7 @@ const DraftPage = () => { const offset = page * LIMIT; const primaryCategory = filter.length ? filter : []; const order = sortBy === "Modified On" ? "desc" : "asc"; - const sort_by = { - lastUpdatedOn: order, - }; + const sort_by = { lastUpdatedOn: order }; const response = await getContent( ["Draft", "FlagDraft"], query, @@ -100,9 +104,10 @@ const DraftPage = () => { ); setContentList(contentList); setTotalCount(response?.count); - setLoading(false); } catch (error) { - console.log(error); + console.error(error); + } finally { + setLoading(false); } }; getDraftContentList(); @@ -111,8 +116,10 @@ const DraftPage = () => { return ( - Draft Content - Here you see all your draft content. + Drafts + + Create, organize, and manage all types of content in one place. + { /> - - {loading ? ( - - ) : contentList && contentList.length > 0 ? ( - contentList?.map((content, index) => ( - - handleDelete(index)} - /> - - )) - ) : ( - - )} - + {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + + + Title & Description + Content Type + Status + Last Modified + Actions + + + + {contentList.map((content: any, index) => ( + + openEditor(content)}> + + {content.name} + + + {content.name} + + + {content.description} + + + + + {content.primaryCategory} + + {content.status} + + + {new Date(content.lastUpdatedOn).toLocaleString()} + + + handleDelete(index)} + color="error" + > + + + + + ))} + +
+
+ ) : ( + + )} + {totalCount > LIMIT && ( setPage(newPage)} /> )}
diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index d3a2f45..64e4f13 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -1,30 +1,41 @@ import React, { useEffect, useMemo, useState } from "react"; import Layout from "../../../../components/Layout"; -import { Typography, Box } from "@mui/material"; -import CourseCard from "../../../../components/CourseCard"; -import SearchBox from "../../../../components/SearchBox"; +import { + Typography, + Box, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + IconButton, + CircularProgress, +} from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; import { getContent } from "@/services/ContentService"; -import Loader from "@/components/Loader"; -import NoDataFound from "@/components/NoDataFound"; +import SearchBox from "../../../../components/SearchBox"; import PaginationComponent from "@/components/PaginationComponent"; +import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; +import { useRouter } from "next/router"; +import { MIME_TYPE } from "@/utils/app.config"; const PublishPage = () => { const [selectedKey, setSelectedKey] = useState("publish"); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(5); const [searchTerm, setSearchTerm] = useState(""); - const [filter, setFilter] = useState(); + const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("updated"); - const [contentList, setContentList] = React.useState([]); - const [loading, setLoading] = useState(false); + const [contentList, setContentList] = React.useState([]); const [contentDeleted, setContentDeleted] = React.useState(false); + const [loading, setLoading] = useState(false); + const [totalCount, setTotalCount] = useState(0); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); - const [page, setPage] = useState(0); - const [totalCount, setTotalCount] = useState(0); - const handleChangePage = (event: unknown, newPage: number) => { - setPage(newPage - 1); - }; + const router = useRouter(); useEffect(() => { const handler = setTimeout(() => { @@ -48,25 +59,27 @@ const PublishPage = () => { setSortBy(sortBy); }; - const filteredData = useMemo( - () => - contentList?.filter((content) => - content.name.toLowerCase().includes(searchTerm) - ), - [searchTerm] - ); - - const displayedCards = filteredData - ?.slice - // page * rowsPerPage, - // page * rowsPerPage + rowsPerPage - (); - const handleDelete = (index: number) => { console.log(`Deleting item at index ${index}`); - setTimeout(() => { - setContentDeleted((prev) => !prev); - }, 1000); + setContentDeleted((prev) => !prev); + }; + + const openEditor = (content: any) => { + const identifier = content?.identifier; + const mode = "read"; + if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { + router.push({ pathname: `/editor`, query: { identifier, mode } }); + } else if ( + content?.mimeType && + MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/upload-editor`, query: { identifier } }); + } else if ( + content?.mimeType && + MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/collection`, query: { identifier, mode } }); + } }; useEffect(() => { @@ -75,11 +88,9 @@ const PublishPage = () => { setLoading(true); const query = debouncedSearchTerm || ""; const offset = page * LIMIT; - const primaryCategory = filter?.length ? filter : []; + const primaryCategory = filter.length ? filter : []; const order = sortBy === "Modified On" ? "desc" : "asc"; - const sort_by = { - lastUpdatedOn: order, - }; + const sort_by = { lastUpdatedOn: order }; const response = await getContent( ["Live"], query, @@ -93,9 +104,10 @@ const PublishPage = () => { ); setContentList(contentList); setTotalCount(response?.count); - setLoading(false); } catch (error) { - console.log(error); + console.error(error); + } finally { + setLoading(false); } }; getPublishContentList(); @@ -104,10 +116,10 @@ const PublishPage = () => { return ( - Content Publish - Here you see all your Publish content. + Content Publish + Here you see all your published content. - + { /> - - {loading ? ( - - ) : contentList && contentList.length > 0 ? ( - contentList?.map((content, index) => ( - - handleDelete(index)} - /> - - )) - ) : ( - - )} - + {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + + + Title & Description + Content Type + Status + Last Modified + Actions + + + + {contentList.map((content: any, index) => ( + + openEditor(content)}> + + {content.name} + + + {content.name} + + + {content.description} + + + + + {content.primaryCategory} + + {content.status} + + + {new Date(content.lastUpdatedOn).toLocaleString()} + + + handleDelete(index)} + color="error" + > + + + + + ))} + +
+
+ ) : ( + + )} + {totalCount > LIMIT && ( setPage(newPage)} /> )}
diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 9dd805b..51cc153 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -1,32 +1,38 @@ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useState } from "react"; import Layout from "../../../../components/Layout"; -import { Typography, Box } from "@mui/material"; -import CourseCard from "../../../../components/CourseCard"; -import SearchBox from "../../../../components/SearchBox"; +import { + Typography, + Box, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + IconButton, + CircularProgress, +} from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; import { getContent } from "@/services/ContentService"; -import Loader from "@/components/Loader"; -import NoDataFound from "@/components/NoDataFound"; -import { setTimeout } from "timers"; +import SearchBox from "../../../../components/SearchBox"; import PaginationComponent from "@/components/PaginationComponent"; +import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; +import { MIME_TYPE } from "@/utils/app.config"; +import router from "next/router"; const SubmittedForReviewPage = () => { const [selectedKey, setSelectedKey] = useState("submitted"); - const [filter, setFilter] = useState(); + const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("updated"); const [searchTerm, setSearchTerm] = useState(""); - const [contentList, setContentList] = React.useState([]); + const [contentList, setContentList] = useState([]); const [loading, setLoading] = useState(false); - const [contentDeleted, setContentDeleted] = React.useState(false); - const [debouncedSearchTerm, setDebouncedSearchTerm] = - useState(searchTerm); + const [contentDeleted, setContentDeleted] = useState(false); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); const [page, setPage] = useState(0); const [totalCount, setTotalCount] = useState(0); - const handleChangePage = (event: unknown, newPage: number) => { - setPage(newPage - 1); - }; - useEffect(() => { const handler = setTimeout(() => { setDebouncedSearchTerm(searchTerm); @@ -36,6 +42,7 @@ const SubmittedForReviewPage = () => { clearTimeout(handler); }; }, [searchTerm]); + const handleSearch = (search: string) => { setSearchTerm(search.toLowerCase()); }; @@ -48,25 +55,9 @@ const SubmittedForReviewPage = () => { setSortBy(sortBy); }; - const filteredData = useMemo( - () => - contentList?.filter((content) => - content?.name.toLowerCase().includes(searchTerm) - ), - [searchTerm] - ); - - const displayedCards = filteredData - ?.slice - // page * rowsPerPage, - // page * rowsPerPage + rowsPerPage - (); - const handleDelete = (index: number) => { console.log(`Deleting item at index ${index}`); - setTimeout(() => { - setContentDeleted((prev) => !prev); - }, 1000); + setContentDeleted((prev) => !prev); }; useEffect(() => { @@ -75,11 +66,9 @@ const SubmittedForReviewPage = () => { setLoading(true); const query = debouncedSearchTerm || ""; const offset = page * LIMIT; - const primaryCategory = filter?.length ? filter : []; + const primaryCategory = filter.length ? filter : []; const order = sortBy === "Modified On" ? "desc" : "asc"; - const sort_by = { - lastUpdatedOn: order, - }; + const sort_by = { lastUpdatedOn: order }; const response = await getContent( ["Review", "FlagReview"], query, @@ -93,23 +82,42 @@ const SubmittedForReviewPage = () => { ); setContentList(contentList); setTotalCount(response?.count); - setLoading(false); } catch (error) { - console.log(error); + console.error(error); + } finally { + setLoading(false); } }; getReviewContentList(); }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + const openEditor = (content: any) => { + const identifier = content?.identifier; + const mode = "review"; + if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { + router.push({ pathname: `/editor`, query: { identifier, mode } }); + } else if ( + content?.mimeType && + MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/upload-editor`, query: { identifier } }); + } else if ( + content?.mimeType && + MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) + ) { + router.push({ pathname: `/collection`, query: { identifier, mode } }); + } + }; + return ( - Content Submitted For ReviewPage - - Here you see all your content Submitted For ReviewPage. + Submitted For Review + + Here you can see all your content submitted for review. - + { /> - - {loading ? ( - - ) : contentList && contentList.length > 0 ? ( - contentList?.map((content, index) => ( - - handleDelete(index)} - /> - - )) - ) : ( - - )} - + {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + + + Title & Description + Content Type + Status + Last Modified + Actions + + + + {contentList.map((content: any, index) => ( + + openEditor(content)}> + + {content.name} + + + {content.name} + + + {content.description} + + + + + {content.primaryCategory} + + {content.status} + + + {new Date(content.lastUpdatedOn).toLocaleString()} + + + handleDelete(index)} + color="error" + > + + + + + ))} + +
+
+ ) : ( + + )} + {totalCount > LIMIT && ( setPage(newPage)} /> )}
From 11ac4087c9615ab8afaf7f797b97867d6a8ad2d6 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sat, 9 Nov 2024 22:49:33 +0530 Subject: [PATCH 034/126] Issue #PS-0000 fix: Fixed build issue --- src/pages/workspace/content/create/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 32ceabf..85f2996 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -120,7 +120,7 @@ const CreatePage = () => { > Create, organize, and manage all types of content in one place. - Whether it's courses, assessments, or any other type of content. + Whether it's courses, assessments, or any other type of content. Here you can create new content.... From c35d61db7e79670427d200ea401fa98b74a78881 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sun, 10 Nov 2024 00:54:51 +0530 Subject: [PATCH 035/126] Issue #PS-0000 fix: Fixed workspace UI --- public/150+.png | Bin 0 -> 2736 bytes public/logo.png | Bin 0 -> 5141 bytes src/components/Layout.tsx | 2 +- src/components/SideBar.tsx | 55 +++++++++--------- src/components/WorkspaceText.tsx | 31 ++++++++++ .../workspace/content/allContents/index.tsx | 2 + src/pages/workspace/content/create/index.tsx | 40 ++++--------- src/pages/workspace/content/draft/index.tsx | 2 + src/pages/workspace/content/publish/index.tsx | 2 + .../workspace/content/submitted/index.tsx | 2 + src/styles/global.css | 6 ++ 11 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 public/150+.png create mode 100644 public/logo.png create mode 100644 src/components/WorkspaceText.tsx diff --git a/public/150+.png b/public/150+.png new file mode 100644 index 0000000000000000000000000000000000000000..576ddee019ab6e2dec82cad1242018152e27239a GIT binary patch literal 2736 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 = ({ children, selectedKey, onSelect }) => { return ( - {children} + {children} ); }; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 52b8496..d103b27 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -1,30 +1,28 @@ -import React, { useState } from "react"; -import { useRouter } from "next/router"; +import AddOutlinedIcon from "@mui/icons-material/AddOutlined"; +import AppsOutlinedIcon from "@mui/icons-material/AppsOutlined"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import CloseIcon from "@mui/icons-material/Close"; +import CreateOutlinedIcon from "@mui/icons-material/CreateOutlined"; +import MenuIcon from "@mui/icons-material/Menu"; +import OutlinedFlagOutlinedIcon from "@mui/icons-material/OutlinedFlagOutlined"; +import PreviewOutlinedIcon from "@mui/icons-material/PreviewOutlined"; import { Box, + Drawer, + IconButton, List, ListItemButton, ListItemIcon, ListItemText, Typography, - IconButton, - Drawer, - useTheme, useMediaQuery, + useTheme, } from "@mui/material"; -import MenuIcon from "@mui/icons-material/Menu"; -import StorageIcon from "@mui/icons-material/Storage"; -import CreateIcon from "@mui/icons-material/Create"; -import DraftsIcon from "@mui/icons-material/Drafts"; -import PublishIcon from "@mui/icons-material/Publish"; -import FolderIcon from "@mui/icons-material/Folder"; -import ArrowBackIcon from "@mui/icons-material/ArrowBack"; -import CloseIcon from "@mui/icons-material/Close"; -import AddOutlinedIcon from "@mui/icons-material/AddOutlined"; -import CreateOutlinedIcon from "@mui/icons-material/CreateOutlined"; -import PreviewOutlinedIcon from "@mui/icons-material/PreviewOutlined"; -import OutlinedFlagOutlinedIcon from "@mui/icons-material/OutlinedFlagOutlined"; -import AppsOutlinedIcon from "@mui/icons-material/AppsOutlined"; +import Image from "next/image"; +import { useRouter } from "next/router"; +import React, { useState } from "react"; + +import logo from "../../public/logo.png"; // Updated menu items with icons const menuItems = [ @@ -68,13 +66,15 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { }; const drawerContent = ( - + + logo + @@ -99,7 +99,7 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { {menuItems.map((item) => ( = ({ selectedKey, onSelect }) => { : "transparent", }, }} - key={item.key} - onClick={() => handleNavigation(item.key)} + key={item?.key} + onClick={() => handleNavigation(item?.key)} > - {item.icon} + {item?.icon} - + ))} diff --git a/src/components/WorkspaceText.tsx b/src/components/WorkspaceText.tsx new file mode 100644 index 0000000..ba293ff --- /dev/null +++ b/src/components/WorkspaceText.tsx @@ -0,0 +1,31 @@ +import { Box, Typography, useTheme } from "@mui/material" +import React from "react"; + + +const WorkspaceText: React.FC = () => { + const theme = useTheme(); + + return ( + + Workspace + + + + Create, organize, and manage all types of content in one place. + Whether it's courses, assessments, or any other type of content. + + ) +} + +export default WorkspaceText; \ No newline at end of file diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 34df271..d5ce693 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -23,6 +23,7 @@ import { MIME_TYPE } from "@/utils/app.config"; import router from "next/router"; import PaginationComponent from "@/components/PaginationComponent"; import { LIMIT } from "@/utils/app.constant"; +import WorkspaceText from "@/components/WorkspaceText"; const AllContentsPage = () => { const theme = useTheme(); @@ -156,6 +157,7 @@ const AllContentsPage = () => { return ( + Show all Content Here you see all your content. diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 85f2996..24810db 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -10,6 +10,9 @@ import { createCourse, createQuestionSet } from "@/services/ContentService"; import QuizOutlinedIcon from "@mui/icons-material/QuizOutlined"; import SchoolOutlinedIcon from "@mui/icons-material/SchoolOutlined"; import VideoLibraryOutlinedIcon from "@mui/icons-material/VideoLibraryOutlined"; +import largeVideoIcon from '../../../../../public/150+.png'; +import Image from "next/image"; +import WorkspaceText from '../../../../components/WorkspaceText' const CreatePage = () => { const theme = useTheme(); @@ -90,7 +93,7 @@ const CreatePage = () => { { title: "New Large Content", description: "Videos and documents larger than 150 MB", - icon: , + icon: large-video, onClick: () => router.push({ pathname: "/upload-editor", @@ -101,31 +104,7 @@ const CreatePage = () => { return ( - - - Workspace - - - - - Create, organize, and manage all types of content in one place. - Whether it's courses, assessments, or any other type of content. - - Here you can create new content.... - - - + {/* Outer box for "Create new content" heading and cards */} { }} m={3} // Margin around the box for spacing > - + Create new content @@ -159,8 +138,9 @@ const CreatePage = () => { cursor: "pointer", flex: "1 1 180px", maxWidth: "220px", + border: "solid 1px #D0C5B4", + boxShadow: 'none', "&:hover": { - boxShadow: theme.shadows[5], backgroundColor: theme.palette.action.hover, }, }} @@ -169,7 +149,7 @@ const CreatePage = () => { {card.title} - + {card.description} diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index e8e30b8..bfa1cd3 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -20,6 +20,7 @@ import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; import { useRouter } from "next/router"; import { MIME_TYPE } from "@/utils/app.config"; +import WorkspaceText from "@/components/WorkspaceText"; const DraftPage = () => { const [selectedKey, setSelectedKey] = useState("draft"); @@ -115,6 +116,7 @@ const DraftPage = () => { return ( + Drafts diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 64e4f13..bebe94b 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -20,6 +20,7 @@ import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; import { useRouter } from "next/router"; import { MIME_TYPE } from "@/utils/app.config"; +import WorkspaceText from "@/components/WorkspaceText"; const PublishPage = () => { const [selectedKey, setSelectedKey] = useState("publish"); @@ -115,6 +116,7 @@ const PublishPage = () => { return ( + Content Publish Here you see all your published content. diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 51cc153..e8935c0 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -20,6 +20,7 @@ import NoDataFound from "@/components/NoDataFound"; import { LIMIT } from "@/utils/app.constant"; import { MIME_TYPE } from "@/utils/app.config"; import router from "next/router"; +import WorkspaceText from "@/components/WorkspaceText"; const SubmittedForReviewPage = () => { const [selectedKey, setSelectedKey] = useState("submitted"); @@ -111,6 +112,7 @@ const SubmittedForReviewPage = () => { return ( + Submitted For Review diff --git a/src/styles/global.css b/src/styles/global.css index ce9e039..3f78700 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -11,3 +11,9 @@ gap: 0px; } } + + +html, body { + margin: 0; + padding: 0; +} \ No newline at end of file From 7dbe4d2df1cb2176ce2d257e78c674ad2a6c57f6 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sun, 10 Nov 2024 01:08:37 +0530 Subject: [PATCH 036/126] Issue #PS-0000 fix: Fixed workspace UI --- src/components/WorkspaceText.tsx | 1 + src/pages/workspace/content/create/index.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/WorkspaceText.tsx b/src/components/WorkspaceText.tsx index ba293ff..b27ec72 100644 --- a/src/components/WorkspaceText.tsx +++ b/src/components/WorkspaceText.tsx @@ -11,6 +11,7 @@ const WorkspaceText: React.FC = () => { sx={{ color: theme.palette.text.primary, marginRight: "10px", + fontSize: "22px" }} > Workspace diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 24810db..657ec16 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -145,12 +145,12 @@ const CreatePage = () => { }, }} > - {card.icon} - - {card.title} + {card?.icon} + + {card?.title} - {card.description} + {card?.description} ))} From bbb1b3af4370df4622faef375703c5a04edbe09a Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sun, 10 Nov 2024 01:22:49 +0530 Subject: [PATCH 037/126] Issue #PS-0000 fix: Fixed workspace UI --- src/components/SideBar.tsx | 2 +- src/pages/workspace/content/create/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index d103b27..1c4b3f3 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -22,7 +22,7 @@ import Image from "next/image"; import { useRouter } from "next/router"; import React, { useState } from "react"; -import logo from "../../public/logo.png"; +import logo from "/public/logo.png"; // Updated menu items with icons const menuItems = [ diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 657ec16..5fea786 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -10,7 +10,7 @@ import { createCourse, createQuestionSet } from "@/services/ContentService"; import QuizOutlinedIcon from "@mui/icons-material/QuizOutlined"; import SchoolOutlinedIcon from "@mui/icons-material/SchoolOutlined"; import VideoLibraryOutlinedIcon from "@mui/icons-material/VideoLibraryOutlined"; -import largeVideoIcon from '../../../../../public/150+.png'; +import largeVideoIcon from '/public/150+.png'; import Image from "next/image"; import WorkspaceText from '../../../../components/WorkspaceText' From cd032421e3b85ca6a6f712f7469e8a4698f2b405 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sun, 10 Nov 2024 01:30:43 +0530 Subject: [PATCH 038/126] Issue #PS-0000 fix: Fixed workspace UI --- src/components/SideBar.tsx | 2 +- src/pages/workspace/content/create/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 1c4b3f3..f98d2fa 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -67,7 +67,7 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { const drawerContent = ( - logo + logo { { title: "New Large Content", description: "Videos and documents larger than 150 MB", - icon: large-video, + icon: large-video, onClick: () => router.push({ pathname: "/upload-editor", From 1323611ac1b1fe526ddf13dcf881b20b3f3c0f1b Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Sun, 10 Nov 2024 16:36:45 +0530 Subject: [PATCH 039/126] Issue #PS-0000 fix: Fixed workspace UI --- src/pages/workspace/content/allContents/index.tsx | 6 ++++-- src/pages/workspace/content/create/index.tsx | 2 +- src/pages/workspace/content/draft/index.tsx | 8 +++++--- src/pages/workspace/content/publish/index.tsx | 6 ++++-- src/pages/workspace/content/review/index.tsx | 2 +- src/pages/workspace/content/submitted/index.tsx | 9 ++++++--- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index d5ce693..8794e1d 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -159,8 +159,10 @@ const AllContentsPage = () => { - Show all Content - Here you see all your content. + + All My Contents + + {/* Here you see all your content. */} { }} m={3} // Margin around the box for spacing > - + Create new content diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index bfa1cd3..123aaab 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -118,10 +118,12 @@ const DraftPage = () => { - Drafts - + + Drafts + + {/* Create, organize, and manage all types of content in one place. - + */} { - Content Publish - Here you see all your published content. + + Published + + {/* Here you see all your published content. */} { variant="h5" sx={{ fontFamily: "inherit", - fontWeight: 400, + fontWeight: "bold", fontSize: "22px", lineHeight: "24px", letterSpacing: "0.5px", diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index e8935c0..c847639 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -114,10 +114,13 @@ const SubmittedForReviewPage = () => { - Submitted For Review - + + + Submitted For Review + + {/* Here you can see all your content submitted for review. - + */} Date: Sun, 10 Nov 2024 23:44:46 +0530 Subject: [PATCH 040/126] Issue #PS-0000 fix: Fixed workspace review redirection --- src/components/Layout.tsx | 2 +- src/components/SearchBox.tsx | 8 ++++---- src/components/SideBar.tsx | 2 +- src/pages/workspace/content/allContents/index.tsx | 2 +- src/pages/workspace/content/draft/index.tsx | 2 +- src/pages/workspace/content/publish/index.tsx | 2 +- src/pages/workspace/content/submitted/index.tsx | 6 +++--- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 8c7d8aa..20df430 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -10,7 +10,7 @@ interface LayoutProps { const Layout: React.FC = ({ children, selectedKey, onSelect }) => { return ( - + {children} diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index ad2c89e..cae7407 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -96,8 +96,8 @@ const SearchBox: React.FC = ({ }; return ( - - + + = ({ - + Filter By = ({ selectedKey, onSelect }) => { display: "flex", justifyContent: "flex-start", width: 250, - height: "100vh", + // height: "100vh", bgcolor: theme.palette.background.paper, borderRight: 1, borderColor: theme.palette.divider, diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 8794e1d..1b07039 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -197,7 +197,7 @@ const AllContentsPage = () => { sx={{ cursor: "pointer" }} > {content?.appIcon ? ( - + ) : ( )} diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 123aaab..561a1a6 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -160,7 +160,7 @@ const DraftPage = () => { openEditor(content)}> {content.name} { openEditor(content)}> {content.name} { content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) ) { - router.push({ pathname: `/upload-editor`, query: { identifier } }); + router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); } else if ( content?.mimeType && MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) @@ -157,8 +157,8 @@ const SubmittedForReviewPage = () => { openEditor(content)}> {content.name} Date: Mon, 11 Nov 2024 17:34:21 +0530 Subject: [PATCH 041/126] Issue #PS-0000 fix: Youtube content player fixed --- src/pages/sunbirdPlayers.tsx | 6 ++++-- src/utils/app.config.ts | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/pages/sunbirdPlayers.tsx b/src/pages/sunbirdPlayers.tsx index ca83ff1..4e3809a 100644 --- a/src/pages/sunbirdPlayers.tsx +++ b/src/pages/sunbirdPlayers.tsx @@ -54,9 +54,11 @@ const SunbirdPlayers = ({ "player-config": playerConfig }: PlayerProps) => { case "application/epub": return ; case "application/vnd.ekstep.h5p-archive": - return ; case "application/vnd.ekstep.html-archive": - return ; + case "video/youtube": + case "video/x-youtube": + // return ; + return ; default: return
Unsupported media type
; } diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index 97e5532..90c26aa 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -4,19 +4,24 @@ export const MIME_TYPE = { GENERIC_MIME_TYPE: [ "application/pdf", "video/mp4", - "video/x-youtube", - "video/youtube", "application/vnd.ekstep.html-archive", "application/epub", "application/vnd.ekstep.h5p-archive", "video/webm", "text/x-url", + "video/x-youtube", + "video/youtube" ], QUESTIONSET_MIME_TYPE: "application/vnd.sunbird.questionset", COURSE_MIME_TYPE: "application/vnd.ekstep.content-collection", - INTERACTIVE_MIME_TYPE: ["application/vnd.ekstep.h5p-archive", "application/vnd.ekstep.html-archive"] + INTERACTIVE_MIME_TYPE: [ + "application/vnd.ekstep.h5p-archive", + "application/vnd.ekstep.html-archive", + "video/x-youtube", + "video/youtube"] }; export const TENANTID = { ID: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", }; +https://www.figma.com/design/qTfxC9E9rFMJqZdL0K6JTJ/SCP-Dev-Admin?node-id=841-866&node-type=section&t=0Ufxp3lS0voj13fK-11 \ No newline at end of file From b9e942300928817cab22426a6d41f60f39cff6ba Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Mon, 11 Nov 2024 17:35:20 +0530 Subject: [PATCH 042/126] Issue #PS-0000 fix: Youtube content player fixed --- src/utils/app.config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index 90c26aa..b459211 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -23,5 +23,4 @@ export const MIME_TYPE = { export const TENANTID = { ID: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", -}; -https://www.figma.com/design/qTfxC9E9rFMJqZdL0K6JTJ/SCP-Dev-Admin?node-id=841-866&node-type=section&t=0Ufxp3lS0voj13fK-11 \ No newline at end of file +}; \ No newline at end of file From 6abd0f93a28e57bfda8e1f0f8fbc82b4ee63d49a Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Mon, 11 Nov 2024 22:26:52 +0530 Subject: [PATCH 043/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/V1-Player/V1Player.tsx | 2 +- src/pages/workspace/content/review/index.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/V1-Player/V1Player.tsx b/src/components/V1-Player/V1Player.tsx index 03a8758..4466dae 100644 --- a/src/components/V1-Player/V1Player.tsx +++ b/src/components/V1-Player/V1Player.tsx @@ -41,7 +41,7 @@ const V1Player = ({ playerConfig }: PlayerProps) => { title="Content Player" src="/content/preview/preview.html?webview=true" aria-label="Content Player" - style={{ width: '100%', height: '600px', border: 'none' }} + style={{ width: '100%', height: '100%', border: 'none' }} >
); diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index e799781..ded0cbc 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -174,7 +174,7 @@ const ReviewContentSubmissions = () => { borderRadius: "16px", padding: 2, backgroundColor: "white", - mb: 2, + // mb: 2, }} > { { border: "1px solid #ccc", borderRadius: "16px", backgroundColor: "white", - height: "607px", + height: "100%", overflow: "auto", }} > @@ -369,7 +369,7 @@ const ReviewContentSubmissions = () => { - - + + + + ) : ( No content details available diff --git a/src/styles/global.css b/src/styles/global.css index 3f78700..61108a5 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -13,7 +13,8 @@ } -html, body { +html, +body { margin: 0; padding: 0; } \ No newline at end of file From 63c945341f356554ae420447c5909ee15fa2ba4d Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Tue, 12 Nov 2024 17:11:47 +0530 Subject: [PATCH 048/126] Issue feat:fix pagination --- src/pages/workspace/content/draft/index.tsx | 2 +- src/pages/workspace/content/publish/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 561a1a6..c0ea1e5 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -216,7 +216,7 @@ const DraftPage = () => { setPage(newPage)} + onPageChange={(event, newPage) => setPage(newPage-1)} /> )} diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 928a9b5..44f1b74 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -214,7 +214,7 @@ const PublishPage = () => { setPage(newPage)} + onPageChange={(event, newPage) => setPage(newPage-1)} /> )} From 5f6ab892404f88b64e1a1e3acd37e208aa89af5a Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Tue, 12 Nov 2024 22:37:20 +0530 Subject: [PATCH 049/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/Layout.tsx | 2 +- src/components/SearchBox.tsx | 10 +- src/components/SideBar.tsx | 12 +- src/components/WorkspaceText.tsx | 16 +- .../workspace/content/allContents/index.tsx | 218 ++++++++------- src/pages/workspace/content/draft/index.tsx | 250 +++++++++++------- src/pages/workspace/content/publish/index.tsx | 240 ++++++++++------- src/pages/workspace/content/review/index.tsx | 71 ++--- .../workspace/content/submitted/index.tsx | 236 ++++++++++------- src/styles/global.css | 12 + 10 files changed, 635 insertions(+), 432 deletions(-) diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 20df430..fff120a 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -12,7 +12,7 @@ const Layout: React.FC = ({ children, selectedKey, onSelect }) => { return ( - {children} + {children} ); }; diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index a0aff77..ab45b22 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -108,6 +108,7 @@ const SearchBox: React.FC = ({ borderRadius: "50px", background: theme.palette.warning.A700, boxShadow: "none", + border: "1px solid #000000DE !important", }} > = ({
- + Filter By + diff --git a/src/components/WorkspaceText.tsx b/src/components/WorkspaceText.tsx index e7adbfc..86bbcea 100644 --- a/src/components/WorkspaceText.tsx +++ b/src/components/WorkspaceText.tsx @@ -7,8 +7,10 @@ const WorkspaceText: React.FC = () => { return ( diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 468e991..290750e 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -140,9 +140,9 @@ const AllContentsPage = () => { getContentList(); }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); - useEffect(() => { + useEffect(() => { const filteredArray = contentList.map(item => ({ - image: item?.appIcon , + image: item?.appIcon, name: item.name, primaryCategory: item.primaryCategory, @@ -152,12 +152,12 @@ const AllContentsPage = () => { mimeType: item.mimeType, mode: item.mode - })); - setData(filteredArray) - console.log(filteredArray) + })); + setData(filteredArray) + console.log(filteredArray) }, [contentList]); - const handleDeleteClick = async (content: any) => { + const handleDeleteClick = async (content: any) => { if (content?.identifier && content?.mimeType) { try { await deleteContent(content?.identifier, content?.mimeType); @@ -183,13 +183,13 @@ const AllContentsPage = () => { page * rowsPerPage, page * rowsPerPage + rowsPerPage ); -console.log("contentList",contentList) + console.log("contentList", contentList) return ( - - All My Contents + + All My Contents {/* Here you see all your content. */} @@ -200,7 +200,7 @@ console.log("contentList",contentList) onFilterChange={handleFilterChange} onSortChange={handleSortChange} /> - + {loading ? ( @@ -209,15 +209,17 @@ console.log("contentList",contentList) contentList && contentList.length > 0 && ( <> - - + + + + ) ) : ( )} - + ); diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 01de8f0..b54941d 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -24,12 +24,14 @@ import WorkspaceText from "@/components/WorkspaceText"; import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import Paper from '@mui/material/Paper'; +import { timeAgo } from "@/utils/Helper"; + const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String }, - { key: 'status', title: 'Status', dataType: DataType.String }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String }, - { key: 'action', title: 'Action', dataType: DataType.String }, + { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, }, + { key: 'contentType', title: 'Content Type', dataType: DataType.String, }, + { key: 'status', title: 'Status', dataType: DataType.String, }, + { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, }, + { key: 'action', title: 'Action', dataType: DataType.String, }, ] @@ -60,20 +62,20 @@ const DraftPage = () => { useEffect(() => { const filteredArray = contentList.map((item: any) => ({ - image: item?.appIcon , + image: item?.appIcon, name: item?.name, - description: item?.description , + description: item?.description, contentType: item.primaryCategory, - lastUpdatedOn:new Date(item.lastUpdatedOn).toLocaleString(), + lastUpdatedOn: timeAgo(item.lastUpdatedOn), status: item.status, identifier: item.identifier, mimeType: item.mimeType, mode: item.mode - })); - setData(filteredArray) - console.log(filteredArray) + })); + setData(filteredArray) + console.log(filteredArray) }, [contentList]); const handleSearch = (search: string) => { @@ -144,6 +146,7 @@ const DraftPage = () => { getDraftContentList(); }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + return ( @@ -170,23 +173,26 @@ const DraftPage = () => { /> {loading ? ( - - - - ) : contentList && contentList.length > 0 ? ( - + + + + ) : contentList && contentList.length > 0 ? ( + + + + ) : ( - - )} - - {totalCount > LIMIT && ( - setPage(newPage-1)} - /> - )} - + + )} + + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} + diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 8ca755e..c75aec5 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -23,6 +23,7 @@ import { MIME_TYPE } from "@/utils/app.config"; import WorkspaceText from "@/components/WorkspaceText"; import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; +import { timeAgo } from "@/utils/Helper"; const columns = [ { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String }, @@ -62,20 +63,20 @@ const PublishPage = () => { }, [searchTerm]); useEffect(() => { const filteredArray = contentList.map((item: any) => ({ - image: item?.appIcon , + image: item?.appIcon, name: item?.name, - description: item?.description , + description: item?.description, contentType: item.primaryCategory, - lastUpdatedOn:new Date(item.lastUpdatedOn).toLocaleString(), + lastUpdatedOn: timeAgo(item.lastUpdatedOn), status: item.status, identifier: item.identifier, mimeType: item.mimeType, mode: item.mode - })); - setData(filteredArray) - console.log(filteredArray) + })); + setData(filteredArray) + console.log(filteredArray) }, [contentList]); const handleSearch = (search: string) => { setSearchTerm(search.toLowerCase()); @@ -159,25 +160,27 @@ const PublishPage = () => { {/* Here you see all your published content. */} - {loading ? ( - - - - ) : contentList && contentList.length > 0 ? ( - - ) : ( - - )} - - - {totalCount > LIMIT && ( - setPage(newPage-1)} - /> - )} - + {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + + ) : ( + + )} + + + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} + ); diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 009e64d..6801192 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -23,6 +23,7 @@ import router from "next/router"; import WorkspaceText from "@/components/WorkspaceText"; import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; +import { timeAgo } from "@/utils/Helper"; const columns = [ { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String }, { key: 'contentType', title: 'Content Type', dataType: DataType.String }, @@ -56,20 +57,20 @@ const SubmittedForReviewPage = () => { }, [searchTerm]); useEffect(() => { const filteredArray = contentList.map((item: any) => ({ - image: item?.appIcon , + image: item?.appIcon, name: item?.name, - description: item?.description , + description: item?.description, contentType: item.primaryCategory, - lastUpdatedOn:new Date(item.lastUpdatedOn).toLocaleString(), + lastUpdatedOn: timeAgo(item.lastUpdatedOn), status: item.status, identifier: item.identifier, mimeType: item.mimeType, mode: item.mode - })); - setData(filteredArray) - console.log(filteredArray) + })); + setData(filteredArray) + console.log(filteredArray) }, [contentList]); const handleSearch = (search: string) => { setSearchTerm(search.toLowerCase()); @@ -157,38 +158,40 @@ const SubmittedForReviewPage = () => { Here you can see all your content submitted for review. */} - - - + + + - {loading ? ( - - - - ) : contentList && contentList.length > 0 ? ( - + {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + ) : ( - - )} + + )} - - {totalCount > LIMIT && ( - setPage(newPage-1)} - /> - )} - + + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} + ); diff --git a/src/styles/global.css b/src/styles/global.css index bcbae1e..d5eba71 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,5 +1,3 @@ - - .player-grid { height: 100%; width: 100%; @@ -37,6 +35,7 @@ body { .ka-thead-cell { font-weight: 600; } + .ka-thead-cell-content { font-weight: normal !important; } @@ -45,6 +44,11 @@ body { .ka-thead-background { z-index: 1; color: white; - background: #a8a6a6; - background-color: #F8EFE7 !important;; + background: #a8a6a6; + background-color: #F8EFE7 !important; + ; +} + +.ka-table-wrapper { + height: 50vh !important; } \ No newline at end of file diff --git a/src/utils/Helper.ts b/src/utils/Helper.ts index fd6a8a2..1699054 100644 --- a/src/utils/Helper.ts +++ b/src/utils/Helper.ts @@ -48,3 +48,8 @@ export const handleExitEvent = () => { window.history.go(-1); } }; + + + + + From 049fe8ec4096cbfc3b0eeee0d0c4ed58c9b30327 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Thu, 14 Nov 2024 16:20:35 +0530 Subject: [PATCH 055/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/utils/Helper.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/utils/Helper.ts b/src/utils/Helper.ts index 1699054..fd6a8a2 100644 --- a/src/utils/Helper.ts +++ b/src/utils/Helper.ts @@ -48,8 +48,3 @@ export const handleExitEvent = () => { window.history.go(-1); } }; - - - - - From f09264fd01ee7a63a4506e709a35cad2be6efef0 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Thu, 14 Nov 2024 22:32:00 +0530 Subject: [PATCH 056/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- public/delete.png | Bin 0 -> 285 bytes src/components/KaTableComponent.tsx | 29 ++++++++++++++++++++-------- src/styles/global.css | 26 ++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 public/delete.png diff --git a/public/delete.png b/public/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..51d68750ee72c0f926b90e1d09193fc7cdfd528a GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^!ayvQ&^#jT#1=NJCH@+(+plH=9ypY`+00?%@OND(~t ff@{r-^c{?f23|@%D*GCMu4nLc^>bP0l+XkK#%XA= literal 0 HcmV?d00001 diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 0942ae9..4bcacd9 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -7,6 +7,7 @@ import "ka-table/style.css"; import DeleteIcon from "@mui/icons-material/Delete"; import router from "next/router"; import { MIME_TYPE } from "@/utils/app.config"; +import Image from "next/image"; interface CustomTableProps { data: any[]; // Define a more specific type for your data if needed @@ -149,9 +150,9 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel else if (props.column.key === 'contentAction') { if (props.rowData.status === "Draft") { return ( - = ({ data, columns, handleDel alignItems: 'center' }}> - + {/* */} + Image + - + ); } } @@ -173,9 +181,9 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel return ( - = ({ data, columns, handleDel alignItems: 'center' }}> - + Image - + ); } return props.children; // Default content for other columns diff --git a/src/styles/global.css b/src/styles/global.css index d5eba71..cf13d2d 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,3 +1,5 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap"); + .player-grid { height: 100%; width: 100%; @@ -17,7 +19,8 @@ html, body { margin: 0; padding: 0; - background: '#F3F5F8'; + background: 'red'; + font-family: Poppins, sans-serif !important; } .drawer-select div div { @@ -51,4 +54,25 @@ body { .ka-table-wrapper { height: 50vh !important; +} + +.css-1bxxajt-MuiInputBase-root-MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline { + border-color: #FDBE16 !important; +} + +/* .delete-icon { + background-image: url('../Assets/image/delete.png') !important; + height: 18px; + width: 18px; +} */ + +div h1, +h2, +h3, +h4, +h5, +h6, +span, +p .css-1ydl6z0-MuiTypography-root { + font-family: Poppins, sans-serif !important; } \ No newline at end of file From df292a9764eb5f6fadae866516f1066f046953b3 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:21:16 +0530 Subject: [PATCH 057/126] Issue #PS-2512 feat: Changes to get TenantId and ChannelId from env --- src/utils/app.config.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index b459211..b960ec1 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -21,6 +21,12 @@ export const MIME_TYPE = { "video/youtube"] }; -export const TENANTID = { - ID: "ef99949b-7f3a-4a5f-806a-e67e683e38f3", -}; \ No newline at end of file +export const TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID || ''; +if (!TENANT_ID) { + console.warn('NEXT_PUBLIC_TENANT_ID is not set in the environment variables.'); +} + +export const CHANNEL_ID = process.env.NEXT_PUBLIC_CHANNEL_ID || ''; +if (!CHANNEL_ID) { + console.warn('NEXT_PUBLIC_CHANNEL_ID is not set in the environment variables.'); +} From 2951483b6d18bacb3def85b5f09f3b20d5543d46 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:22:03 +0530 Subject: [PATCH 058/126] Issue #PS-2512 feat: Using TenantId and ChannelId from app config --- src/services/ContentService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index f8b85cf..e8bbd56 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -2,17 +2,17 @@ import { stringify } from "json5"; import { getLocalStoredUserData } from "./LocalStorageService"; import { delApi, get, post } from "./RestClient"; import axios from "axios"; -import { MIME_TYPE, TENANTID } from "@/utils/app.config"; +import { MIME_TYPE, TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; const authToken = process.env.NEXT_PUBLIC_AUTH_API_TOKEN; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; import { v4 as uuidv4 } from "uuid"; -import { ChannelID, PrimaryCategoryValue } from "@/utils/app.constant"; +import { PrimaryCategoryValue } from "@/utils/app.constant"; const userId = getLocalStoredUserData(); console.log("userId ==>", userId); export const getPrimaryCategory = async () => { - const apiURL = `/api/channel/v1/read/${ChannelID}`; + const apiURL = `/api/channel/v1/read/${CHANNEL_ID}`; try { const response = await get(apiURL); return response?.data?.result; From bcb200837f343aa092b2cfe51ec7c3698f154fda Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:22:33 +0530 Subject: [PATCH 059/126] Issue #PS-2512 feat: Removing ChannelId from app constant --- src/utils/app.constant.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/utils/app.constant.ts b/src/utils/app.constant.ts index 1452f57..df5c93c 100644 --- a/src/utils/app.constant.ts +++ b/src/utils/app.constant.ts @@ -11,15 +11,12 @@ export enum ContentType { export const SortOptions = ["Modified On", "Created On"]; export const LIMIT = 6; -export const ChannelID = "test-k12-channel"; export const PrimaryCategoryValue = [ "Course", - "Course Assessment", "eTextbook", "Explanation Content", "Learning Resource", "Practice Question Set", - "Teacher Resource", - "Exam Question", + "Teacher Resource" ]; From 6f9e14634b55b060242fff6c7314d5e19919118d Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:23:48 +0530 Subject: [PATCH 060/126] Issue #PS-2512 feat: Using Single TENENAT_ID for client and server side --- .env | 2 +- src/pages/api/fileUpload.ts | 2 +- src/pages/api/proxy.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.env b/.env index bcd20d3..97fbce0 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ BASE_URL="" # Middleware Path - eg : "https://middleware.prathamdigital.org" AUTH_API_TOKEN="" # User Auth Access Token -TENANT_ID="" # Tenant Id of User +NEXT_PUBLIC_TENANT_ID="" # Tenant Id of User CLOUD_STORAGE_URL="" #Use environment variable for S3 Cloud Storage URL \ No newline at end of file diff --git a/src/pages/api/fileUpload.ts b/src/pages/api/fileUpload.ts index 4b22b75..66f82f1 100644 --- a/src/pages/api/fileUpload.ts +++ b/src/pages/api/fileUpload.ts @@ -86,7 +86,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // Set your base URL const baseURL = process.env.BASE_URL as string; const authApiToken = cookies?.authToken || process.env.AUTH_API_TOKEN; - const tenantId = process.env.TENANT_ID as string; + const tenantId = process.env.NEXT_PUBLIC_TENANT_ID as string; console.log("Using token for file upload:", authApiToken); diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index 30e998d..515d495 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -16,7 +16,7 @@ export default async function handler( const { path } = query; const BASE_URL = process.env.BASE_URL as string; - const TENANT_ID = process.env.TENANT_ID as string; + const NEXT_PUBLIC_TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID as string; const API_KEY = process.env.AUTH_API_TOKEN as string; const cookies = cookie.parse(req.headers.cookie || ""); @@ -76,7 +76,7 @@ export default async function handler( headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, - tenantId: TENANT_ID, + tenantId: NEXT_PUBLIC_TENANT_ID, "X-Channel-Id": "test-k12-channel", }, ...(method === "POST" || method === "PATCH" From d40a587abc5217af5a4cd41a08faadb9f42a20b9 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:29:58 +0530 Subject: [PATCH 061/126] Issue #PS-2512 feat: Removed hardcoded TENENAT_ID --- src/components/CollectionEditor.tsx | 5 +++-- src/components/QuestionSetEditor.tsx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 2789588..5c1e665 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -1,13 +1,14 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; +import { TENANT_ID } from "@/utils/app.config"; const CollectionEditor: React.FC = () => { const router = useRouter(); const { identifier, mode } = router.query; const [fullName, setFullName] = useState("Anonymous"); - const [userId, setUserId] = useState("ef99949b-7f3a-4a5f-806a-e67e683e38f3"); + const [userId, setUserId] = useState(TENANT_ID); const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); const [firstName, lastName] = fullName.split(" "); @@ -15,7 +16,7 @@ const CollectionEditor: React.FC = () => { useEffect(() => { const storedFullName = localStorage.getItem("name") || "Anonymous"; const storedUserId = - localStorage.getItem("userId") || "ef99949b-7f3a-4a5f-806a-e67e683e38f3"; + localStorage.getItem("userId") || TENANT_ID; setFullName(storedFullName); setUserId(storedUserId); diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index 294592c..126b4e5 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -1,13 +1,14 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; +import { TENANT_ID } from "@/utils/app.config"; const QuestionSetEditor: React.FC = () => { const router = useRouter(); const { identifier, mode } = router.query; const [fullName, setFullName] = useState("Anonymous"); - const [userId, setUserId] = useState("ef99949b-7f3a-4a5f-806a-e67e683e38f3"); + const [userId, setUserId] = useState(TENANT_ID); const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); const [firstName, lastName] = fullName.split(" "); @@ -15,7 +16,7 @@ const QuestionSetEditor: React.FC = () => { useEffect(() => { const storedFullName = localStorage.getItem("name") || "Anonymous"; const storedUserId = - localStorage.getItem("userId") || "ef99949b-7f3a-4a5f-806a-e67e683e38f3"; + localStorage.getItem("userId") || TENANT_ID; setFullName(storedFullName); setUserId(storedUserId); From 9f8d3c478d5a9d6631ae8eb3542d175a3ea6a4e0 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 14:46:52 +0530 Subject: [PATCH 062/126] Issue #PS-2512 feat: Removed hardcoded CHANNEL_ID from code --- src/components/CollectionEditor.tsx | 4 ++-- src/components/QuestionSetEditor.tsx | 9 +++------ src/pages/api/proxy.ts | 9 +++++---- src/services/ContentService.ts | 10 +++------- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 5c1e665..7876413 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; -import { TENANT_ID } from "@/utils/app.config"; +import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; const CollectionEditor: React.FC = () => { const router = useRouter(); @@ -34,7 +34,7 @@ const CollectionEditor: React.FC = () => { orgIds: ["01309282781705830427"], }, identifier: identifier, - channel: "test-k12-channel", + channel: CHANNEL_ID, framework: "test_k12_framework", authToken: " ", sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index 126b4e5..ab6be9a 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; -import { TENANT_ID } from "@/utils/app.config"; +import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; const QuestionSetEditor: React.FC = () => { const router = useRouter(); @@ -26,21 +26,18 @@ const QuestionSetEditor: React.FC = () => { const questionSetEditorConfig = { context: { - programId: "", - contributionOrgId: "", user: { id: userId, fullName: fullName, firstName: firstName || "Anonymous", lastName: lastName || "Anonymous", - orgIds: ["test-k12-channel"], + orgIds: [CHANNEL_ID], }, identifier: identifier, - authToken: " ", sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", did: deviceId, uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", - channel: "test-k12-channel", + channel: CHANNEL_ID, pdata: { id: "dev.dock.portal", ver: "2.8.0", diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts index 515d495..7b5d2d0 100644 --- a/src/pages/api/proxy.ts +++ b/src/pages/api/proxy.ts @@ -16,8 +16,9 @@ export default async function handler( const { path } = query; const BASE_URL = process.env.BASE_URL as string; - const NEXT_PUBLIC_TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID as string; const API_KEY = process.env.AUTH_API_TOKEN as string; + const NEXT_PUBLIC_TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID as string; + const NEXT_PUBLIC_CHANNEL_ID = process.env.NEXT_PUBLIC_CHANNEL_ID as string; const cookies = cookie.parse(req.headers.cookie || ""); @@ -75,9 +76,9 @@ export default async function handler( method, headers: { "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - tenantId: NEXT_PUBLIC_TENANT_ID, - "X-Channel-Id": "test-k12-channel", + "Authorization": `Bearer ${token}`, + "tenantId": NEXT_PUBLIC_TENANT_ID, + "X-Channel-Id": NEXT_PUBLIC_CHANNEL_ID, }, ...(method === "POST" || method === "PATCH" ? { body: JSON.stringify(body) } diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index e8bbd56..53f3051 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -1,10 +1,7 @@ -import { stringify } from "json5"; import { getLocalStoredUserData } from "./LocalStorageService"; import { delApi, get, post } from "./RestClient"; import axios from "axios"; -import { MIME_TYPE, TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; -const authToken = process.env.NEXT_PUBLIC_AUTH_API_TOKEN; -const baseUrl = process.env.NEXT_PUBLIC_BASE_URL; +import { MIME_TYPE, CHANNEL_ID, TENANT_ID } from "@/utils/app.config"; import { v4 as uuidv4 } from "uuid"; import { PrimaryCategoryValue } from "@/utils/app.constant"; @@ -121,7 +118,7 @@ export const createQuestionSet = async () => { const response = await axios.post(apiURL, reqBody, { headers: { "Content-Type": "application/json", - tenantId: TENANTID.ID, + "tenantId": TENANT_ID, }, }); return response?.data; @@ -160,9 +157,8 @@ export const createCourse = async (userId: any) => { name: "Untitled Course", description: "Enter description for Course", createdBy: userId, - createdFor: ["test-k12-channel"], + createdFor: [CHANNEL_ID], mimeType: MIME_TYPE.COURSE_MIME_TYPE, - resourceType: "Course", primaryCategory: "Course", contentType: "Course", From 98cf272bf56f3835fd522f6c1159f0a796a8e316 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Fri, 15 Nov 2024 14:51:00 +0530 Subject: [PATCH 063/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- package.json | 10 +++++----- src/components/Layout.tsx | 4 ++-- src/pages/workspace/content/allContents/index.tsx | 8 ++++---- src/pages/workspace/content/draft/index.tsx | 10 +++++----- src/pages/workspace/content/publish/index.tsx | 10 +++++----- src/pages/workspace/content/submitted/index.tsx | 10 +++++----- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index cbe22d7..5aaacfc 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "lint": "next lint" }, "dependencies": { - "@emotion/react": "11.11.4", - "@emotion/styled": "11.11.5", "@module-federation/nextjs-mf": "^8.5.5", "@module-federation/utilities": "3.0.11", - "@mui/icons-material": "^5.15.20", - "@mui/material": "^5.16.0", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.15", + "@mui/material": "^5.15.21", "@project-sunbird/sunbird-collection-editor-web-component": "^1.6.0", "async": "^3.2.5", "body-parser": "^1.20.2", @@ -55,4 +55,4 @@ "typescript": "^5.6.2", "webpack": "^5.76.2" } -} +} \ No newline at end of file diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index be8ba87..89dba99 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -10,11 +10,11 @@ interface LayoutProps { const Layout: React.FC = ({ children, selectedKey, onSelect }) => { return ( - + - {children} + {children} ); }; diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 290750e..11e87a2 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -29,10 +29,10 @@ import { DataType } from 'ka-table/enums'; import "ka-table/style.css"; import KaTableComponent from "@/components/KaTableComponent"; const columns = [ - { key: 'name', title: 'Content', dataType: DataType.String }, - { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String }, - { key: 'status', title: 'Status', dataType: DataType.String }, - { key: 'contentAction', title: 'Action', dataType: DataType.String }, + { key: 'name', title: 'Content', dataType: DataType.String, width: "450px" }, + { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String, width: "300px" }, + { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, + { key: 'contentAction', title: 'Action', dataType: DataType.String, width: "200px" }, ] const AllContentsPage = () => { diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index b54941d..33de991 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -27,11 +27,11 @@ import Paper from '@mui/material/Paper'; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String, }, - { key: 'status', title: 'Status', dataType: DataType.String, }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, }, - { key: 'action', title: 'Action', dataType: DataType.String, }, + { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, + { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, + { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, + { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, ] diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index c75aec5..8b7149c 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -26,11 +26,11 @@ import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String }, - { key: 'status', title: 'Status', dataType: DataType.String }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String }, - { key: 'action', title: 'Action', dataType: DataType.String }, + { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, + { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, + { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, + { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, ] diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 6801192..d615e48 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -25,11 +25,11 @@ import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String }, - { key: 'status', title: 'Status', dataType: DataType.String }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String }, - { key: 'action', title: 'Action', dataType: DataType.String }, + { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, + { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, + { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, + { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, ] From 9dfe5f8494239fc180f751554e3802aa844111ef Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 17:06:58 +0530 Subject: [PATCH 064/126] Issue #PS-2512 feat: Removed hardcoded CHANNEL_ID from generic-editor config --- src/components/GenericEditor.tsx | 14 ++++++++++++-- src/components/editor.config.json | 12 ++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 30b92c6..3ccb176 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -6,6 +6,7 @@ import 'izimodal/css/iziModal.css'; import 'izimodal/js/iziModal.js'; import editorConfig from './editor.config.json'; import { getLocalStoredUserData } from "@/services/LocalStorageService"; +import { CHANNEL_ID } from "@/utils/app.config"; const GenericEditor: React.FC = () => { const router = useRouter(); @@ -96,9 +97,18 @@ const GenericEditor: React.FC = () => { if (identifier) { window['context'].contentId = identifier; } - window['context'].user.id = getLocalStoredUserData(); + window['context'].user = { + id: getLocalStoredUserData(), + name: localStorage.getItem("name") || "Anonymous", + orgIds: [CHANNEL_ID], + organisations: { + [CHANNEL_ID] : CHANNEL_ID + " Channel" + } + } window['context'].uid = getLocalStoredUserData(); - + window['context'].contextRollUp.l1 = CHANNEL_ID; + window['context'].tags = [CHANNEL_ID]; + window['context'].channel = CHANNEL_ID; if (isLargeFileUpload || (_.get(data, 'contentDisposition') === 'online-only')) { window.context['uploadInfo'] = { isLargeFileUpload: true diff --git a/src/components/editor.config.json b/src/components/editor.config.json index dd4178c..8add592 100644 --- a/src/components/editor.config.json +++ b/src/components/editor.config.json @@ -78,12 +78,12 @@ "WINDOW_CONTEXT": { "user": { "id": "", - "name": "Rahul Tekdi", + "name": "", "orgIds": [ - "test-k12-channel" + "" ], "organisations": { - "test-k12-channel": "Test Channel" + "channel-id": "channel Name" } }, "did": "", @@ -95,12 +95,12 @@ "pid": "admin-portal.genericEditor" }, "contextRollUp": { - "l1": "test-k12-channel" + "l1": "" }, "tags": [ - "test-k12-channel" + "" ], - "channel": "test-k12-channel", + "channel": "", "env": "generic-editor", "framework": "test_k12_framework", "ownershipType": [ From c092d88606b23e66270594c150611f727d9ed7cd Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 17:45:00 +0530 Subject: [PATCH 065/126] Issue #PS-2512 feat: Removed hardcoded UserId and UserName --- src/components/CollectionEditor.tsx | 11 +++++------ src/components/GenericEditor.tsx | 8 ++++---- src/components/QuestionSetEditor.tsx | 11 +++++------ src/pages/workspace/content/create/index.tsx | 9 ++++----- src/services/ContentService.ts | 4 ++-- src/services/LocalStorageService.ts | 18 +++++++++++++++++- 6 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 7876413..f64857b 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -2,22 +2,21 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; - +import { getLocalStoredUserName, getLocalStoredUserId } from "@/services/LocalStorageService"; const CollectionEditor: React.FC = () => { const router = useRouter(); const { identifier, mode } = router.query; - const [fullName, setFullName] = useState("Anonymous"); + const [fullName, setFullName] = useState("Anonymous User"); const [userId, setUserId] = useState(TENANT_ID); const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); const [firstName, lastName] = fullName.split(" "); useEffect(() => { - const storedFullName = localStorage.getItem("name") || "Anonymous"; - const storedUserId = - localStorage.getItem("userId") || TENANT_ID; - setFullName(storedFullName); + const storedFullName = getLocalStoredUserName(); + const storedUserId = getLocalStoredUserId() || TENANT_ID; + setFullName(storedFullName ?? "Anonymous User"); setUserId(storedUserId); const generatedDeviceId = uuidv4(); diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 3ccb176..5605607 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -5,7 +5,7 @@ import _ from 'lodash'; import 'izimodal/css/iziModal.css'; import 'izimodal/js/iziModal.js'; import editorConfig from './editor.config.json'; -import { getLocalStoredUserData } from "@/services/LocalStorageService"; +import { getLocalStoredUserId, getLocalStoredUserName } from "@/services/LocalStorageService"; import { CHANNEL_ID } from "@/utils/app.config"; const GenericEditor: React.FC = () => { @@ -98,14 +98,14 @@ const GenericEditor: React.FC = () => { window['context'].contentId = identifier; } window['context'].user = { - id: getLocalStoredUserData(), - name: localStorage.getItem("name") || "Anonymous", + id: getLocalStoredUserId(), + name: getLocalStoredUserName() || "Anonymous User", orgIds: [CHANNEL_ID], organisations: { [CHANNEL_ID] : CHANNEL_ID + " Channel" } } - window['context'].uid = getLocalStoredUserData(); + window['context'].uid = getLocalStoredUserId(); window['context'].contextRollUp.l1 = CHANNEL_ID; window['context'].tags = [CHANNEL_ID]; window['context'].channel = CHANNEL_ID; diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index ab6be9a..f9adfc7 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -2,22 +2,21 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; - +import { getLocalStoredUserId, getLocalStoredUserName } from "@/services/LocalStorageService"; const QuestionSetEditor: React.FC = () => { const router = useRouter(); const { identifier, mode } = router.query; - const [fullName, setFullName] = useState("Anonymous"); + const [fullName, setFullName] = useState("Anonymous User"); const [userId, setUserId] = useState(TENANT_ID); const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); const [firstName, lastName] = fullName.split(" "); useEffect(() => { - const storedFullName = localStorage.getItem("name") || "Anonymous"; - const storedUserId = - localStorage.getItem("userId") || TENANT_ID; - setFullName(storedFullName); + const storedFullName = getLocalStoredUserName(); + const storedUserId = getLocalStoredUserId() || TENANT_ID; + setFullName(storedFullName ?? "Anonymous User"); setUserId(storedUserId); const generatedDeviceId = uuidv4(); diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 8cefb64..d6c560d 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -12,7 +12,8 @@ import SchoolOutlinedIcon from "@mui/icons-material/SchoolOutlined"; import VideoLibraryOutlinedIcon from "@mui/icons-material/VideoLibraryOutlined"; import largeVideoIcon from '/public/150+.png'; import Image from "next/image"; -import WorkspaceText from '../../../../components/WorkspaceText' +import WorkspaceText from '../../../../components/WorkspaceText'; +import { getLocalStoredUserId } from "@/services/LocalStorageService"; const CreatePage = () => { const theme = useTheme(); @@ -21,7 +22,7 @@ const CreatePage = () => { useEffect(() => { const token = localStorage.getItem("token"); - const userId = localStorage.getItem("userId"); + const userId = getLocalStoredUserId() if (token && userId) { document.cookie = `authToken=${token}; path=/; secure; SameSite=Strict`; @@ -50,9 +51,7 @@ const CreatePage = () => { const fetchCollectionData = async () => { try { - const userId = - localStorage.getItem("userId") || - "5afb0c71-5e85-46f6-8780-3059cbb7bbf9"; + const userId = getLocalStoredUserId(); const response = await createCourse(userId); console.log("Course set created successfully:", response); diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index 53f3051..ca1706f 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -1,11 +1,11 @@ -import { getLocalStoredUserData } from "./LocalStorageService"; +import { getLocalStoredUserId } from "./LocalStorageService"; import { delApi, get, post } from "./RestClient"; import axios from "axios"; import { MIME_TYPE, CHANNEL_ID, TENANT_ID } from "@/utils/app.config"; import { v4 as uuidv4 } from "uuid"; import { PrimaryCategoryValue } from "@/utils/app.constant"; -const userId = getLocalStoredUserData(); +const userId = getLocalStoredUserId(); console.log("userId ==>", userId); export const getPrimaryCategory = async () => { diff --git a/src/services/LocalStorageService.ts b/src/services/LocalStorageService.ts index b68c1a5..efa01df 100644 --- a/src/services/LocalStorageService.ts +++ b/src/services/LocalStorageService.ts @@ -1,4 +1,4 @@ -export const getLocalStoredUserData = () => { +export const getLocalStoredUserId = () => { if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') { try { const userId = localStorage.getItem("userId"); @@ -13,3 +13,19 @@ export const getLocalStoredUserData = () => { return null; } }; + +export const getLocalStoredUserName = () => { + if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') { + try { + const username = localStorage.getItem("name"); + return username ?? "Anonymous User"; + } catch (error) { + console.error("Error retrieving user name from local storage:", error); + return "Anonymous User"; + } + } else { + // Running in SSR, return null + console.warn("Local storage is not available (SSR)"); + return null; + } +}; From 9b69faa2e25d560eeb0f5dfa1661cc287816cfaf Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 18:03:38 +0530 Subject: [PATCH 066/126] Issue #PS-2512 feat: Removed hardcoded channelId from player config --- src/components/players/PlayerConfig.js | 31 ++++++++++---------- src/pages/workspace/content/review/index.tsx | 16 +++++++++- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/components/players/PlayerConfig.js b/src/components/players/PlayerConfig.js index a689907..6c2409e 100644 --- a/src/components/players/PlayerConfig.js +++ b/src/components/players/PlayerConfig.js @@ -3,20 +3,20 @@ export const playerConfig = { mode: "play", partner: [], pdata: { - id: "dev.sunbird.portal", - ver: "5.2.0", - pid: "sunbird-portal", + id: "pratham.admin.portal", + ver: "1.0.0", + pid: "admin-portal", }, - contentId: "do_21374910251798528014586", - sid: "6d1898db-d783-4f83-8b92-4a36636e0d2f", - uid: "fb6b2e58-0f14-4d4f-90e4-bae092e7a235", + contentId: "do_12345", + sid: "", + uid: "", timeDiff: -0.089, - channel: "01269878797503692810", - tags: ["01269878797503692810"], - did: "3ca74a4c5fbce6b7b7f5cd12cebb1682", - contextRollup: { l1: "01269878797503692810" }, + channel: "", + tags: [""], + did: "", + contextRollup: {}, objectRollup: {}, - userData: { firstName: "Guest", lastName: "" }, + userData: { firstName: "Guest", lastName: "User"}, //telemetry host: "https://telemetry.prathamdigital.org", @@ -115,13 +115,12 @@ export const V1PlayerConfig = { sid: "", uid: "", timeDiff: -1.129, - contextRollup: { - }, - channel: "test-k12-channel", + contextRollup: {}, + channel: "", did: "", dims: [], - tags: ["test-k12-channel"], - app: ["test-k12-channel"], + tags: [""], + app: [""], cdata: [], userData: { firstName: "Guest", diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index dc3d5db..652622e 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -28,7 +28,11 @@ import { epubMetadata, } from "../../../../components/players/playerMetadata"; import $ from "jquery"; -import { MIME_TYPE } from "@/utils/app.config"; +import { MIME_TYPE, CHANNEL_ID } from "@/utils/app.config"; +import { getLocalStoredUserName } from "@/services/LocalStorageService"; + +const userFullName = getLocalStoredUserName() || "Anonymous User"; +const [firstName, lastName] = userFullName.split(" "); const ReviewContentSubmissions = () => { const [isContentInteractiveType, setIsContentInteractiveType] = @@ -60,10 +64,20 @@ const ReviewContentSubmissions = () => { if (MIME_TYPE.INTERACTIVE_MIME_TYPE.includes(data?.mimeType)) { V1PlayerConfig.metadata = data; V1PlayerConfig.context.contentId = data.identifier; + V1PlayerConfig.context.channel = CHANNEL_ID; + V1PlayerConfig.context.tags = [CHANNEL_ID]; + V1PlayerConfig.context.app = [CHANNEL_ID]; + V1PlayerConfig.context.userData.firstName = firstName; + V1PlayerConfig.context.userData.lastName = lastName; setIsContentInteractiveType(true); } else { setIsContentInteractiveType(false); playerConfig.metadata = data; + playerConfig.context.contentId = data.identifier; + playerConfig.context.channel = CHANNEL_ID; + playerConfig.context.tags = [CHANNEL_ID]; + playerConfig.context.userData.firstName = firstName; + playerConfig.context.userData.lastName = lastName; } setContentDetails(data); } From 13b8b3fd1c07653e612a7c16444432f4cbc0b46f Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 18:11:29 +0530 Subject: [PATCH 067/126] Issue #PS-2512 feat: Removed hardcoding from editor config --- src/components/CollectionEditor.tsx | 51 +++++++++-------------------- src/components/GenericEditor.tsx | 6 ++-- 2 files changed, 18 insertions(+), 39 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index f64857b..5a99f25 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -9,7 +9,7 @@ const CollectionEditor: React.FC = () => { const [fullName, setFullName] = useState("Anonymous User"); const [userId, setUserId] = useState(TENANT_ID); - const [deviceId, setDeviceId] = useState("7e85b4967aebd6704ba1f604f20056b6"); + const [deviceId, setDeviceId] = useState(""); const [firstName, lastName] = fullName.split(" "); @@ -29,54 +29,33 @@ const CollectionEditor: React.FC = () => { id: userId, fullName: fullName, firstName: firstName || "Anonymous", - lastName: lastName || "Anonymous", - orgIds: ["01309282781705830427"], + lastName: lastName || "User", + orgIds: [CHANNEL_ID], }, identifier: identifier, channel: CHANNEL_ID, framework: "test_k12_framework", - authToken: " ", - sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", + sid: uuidv4(), did: deviceId, - uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", - additionalCategories: [ - { - value: "Textbook", - label: "Textbook", - }, - { - value: "Lesson Plan", - label: "Lesson Plan", - }, - ], + uid: getLocalStoredUserId() || TENANT_ID, + additionalCategories: [], pdata: { - id: "dev.dock.portal", - ver: "2.8.0", - pid: "creation-portal", + id: "pratham.admin.portal", + ver: "1.0.0", + pid: "pratham-portal", }, contextRollup: { - l1: "01307938306521497658", + l1: CHANNEL_ID, }, - tags: ["01307938306521497658"], + tags: [CHANNEL_ID], cdata: [ { - id: "01307938306521497658", - type: "sourcing_organization", - }, - { - type: "project", - id: "ec5cc850-3f71-11eb-aae1-fb99d9fb6737", - }, - { - type: "linked_collection", - id: "do_113140468925825024117", - }, + id: CHANNEL_ID, + type: "pratham-portal", + } ], timeDiff: 5, - objectRollup: { - l1: "do_113140468925825024117", - l2: "do_113140468926914560125", - }, + objectRollup: {}, host: "", defaultLicense: "CC BY 4.0", endpoint: "/data/v3/telemetry", diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 5605607..a11cae4 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -6,7 +6,7 @@ import 'izimodal/css/iziModal.css'; import 'izimodal/js/iziModal.js'; import editorConfig from './editor.config.json'; import { getLocalStoredUserId, getLocalStoredUserName } from "@/services/LocalStorageService"; -import { CHANNEL_ID } from "@/utils/app.config"; +import { CHANNEL_ID, TENANT_ID } from "@/utils/app.config"; const GenericEditor: React.FC = () => { const router = useRouter(); @@ -98,14 +98,14 @@ const GenericEditor: React.FC = () => { window['context'].contentId = identifier; } window['context'].user = { - id: getLocalStoredUserId(), + id: getLocalStoredUserId() || TENANT_ID, name: getLocalStoredUserName() || "Anonymous User", orgIds: [CHANNEL_ID], organisations: { [CHANNEL_ID] : CHANNEL_ID + " Channel" } } - window['context'].uid = getLocalStoredUserId(); + window['context'].uid = getLocalStoredUserId() || TENANT_ID; window['context'].contextRollUp.l1 = CHANNEL_ID; window['context'].tags = [CHANNEL_ID]; window['context'].channel = CHANNEL_ID; From 275f9e246584e5eee5abcbe329e1c30fa4df4006 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 18:24:45 +0530 Subject: [PATCH 068/126] Issue #PS-2512 feat: Removed hardcoding from questionset editor --- src/components/QuestionSetEditor.tsx | 35 ++++++++++------------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index f9adfc7..fe09c45 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -33,38 +33,27 @@ const QuestionSetEditor: React.FC = () => { orgIds: [CHANNEL_ID], }, identifier: identifier, - sid: "iYO2K6dOSdA0rwq7NeT1TDzS-dbqduvV", + sid: uuidv4(), did: deviceId, - uid: "bf020396-0d7b-436f-ae9f-869c6780fc45", + uid: userId, channel: CHANNEL_ID, pdata: { - id: "dev.dock.portal", - ver: "2.8.0", - pid: "creation-portal", + id: "pratham.admin.portal", + ver: "1.0.0", + pid: "pratham-portal", }, contextRollup: { - l1: "01307938306521497658", + l1: CHANNEL_ID, }, - tags: ["01307938306521497658"], + tags: [CHANNEL_ID], cdata: [ { - id: "01307938306521497658", - type: "sourcing_organization", - }, - { - type: "project", - id: "ec5cc850-3f71-11eb-aae1-fb99d9fb6737", - }, - { - type: "linked_collection", - id: "do_113140468925825024117", - }, + id: CHANNEL_ID, + type: "pratham-portal", + } ], timeDiff: 5, - objectRollup: { - l1: "do_113140468925825024117", - l2: "do_113140468926914560125", - }, + objectRollup: {}, host: "", defaultLicense: "CC BY 4.0", endpoint: "/data/v3/telemetry", @@ -79,7 +68,7 @@ const QuestionSetEditor: React.FC = () => { cloudStorage: { provider: "aws", presigned_headers: {}, - }, + } }, config: { mode: mode || "edit", From d8c86766f04f0044b3184b7929f51575eb2809d3 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Fri, 15 Nov 2024 18:39:15 +0530 Subject: [PATCH 069/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/KaTableComponent.tsx | 25 ++++-- src/components/Loader.tsx | 2 +- .../workspace/content/allContents/index.tsx | 77 +++++++++++-------- src/pages/workspace/content/create/index.tsx | 63 +++++++-------- src/pages/workspace/content/draft/index.tsx | 10 +-- src/pages/workspace/content/publish/index.tsx | 8 +- .../workspace/content/submitted/index.tsx | 10 +-- src/styles/global.css | 16 ++++ src/utils/app.constant.ts | 2 +- 9 files changed, 126 insertions(+), 87 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 4bcacd9..22df45c 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -86,7 +86,7 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel {props.rowData.image ? ( Image = ({ data, columns, handleDel }} /> ) : props.column.key === 'name' ? ( - + Image ) : ( = ({ data, columns, handleDel )}
- {props.rowData.name} + {props.rowData.name}
- + {props.column.key === 'name' ? props.rowData.primaryCategory : props.rowData.description}
@@ -127,21 +138,21 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel else if (props.column.key === "status") { if (props.rowData.status === "Draft") { return ( - + {props.rowData.status} ) } if (props.rowData.status === "Review") { return ( - + {props.rowData.status} ) } if (props.rowData.status === "Live") { return ( - + {props.rowData.status} ) diff --git a/src/components/Loader.tsx b/src/components/Loader.tsx index f000169..82af67a 100644 --- a/src/components/Loader.tsx +++ b/src/components/Loader.tsx @@ -8,7 +8,7 @@ const Loader: React.FC<{ showBackdrop: boolean; loadingText: string }> = ({ const Spinner = () => { return ( <> - +
{loadingText}... diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 11e87a2..1593009 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -28,11 +28,20 @@ import { Table as KaTable } from 'ka-table'; import { DataType } from 'ka-table/enums'; import "ka-table/style.css"; import KaTableComponent from "@/components/KaTableComponent"; +// const columns = [ +// { key: 'name', title: 'Content', dataType: DataType.String, width: "450px" }, +// { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String, width: "300px" }, +// { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, +// { key: 'contentAction', title: 'Action', dataType: DataType.String, width: "200px" }, + +// ] const columns = [ - { key: 'name', title: 'Content', dataType: DataType.String, width: "450px" }, - { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String, width: "300px" }, - { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, - { key: 'contentAction', title: 'Action', dataType: DataType.String, width: "200px" }, + { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "100px" }, + { key: 'contentAction', title: 'ACTION', dataType: DataType.String, width: "100px" }, + ] const AllContentsPage = () => { @@ -143,7 +152,7 @@ const AllContentsPage = () => { useEffect(() => { const filteredArray = contentList.map(item => ({ image: item?.appIcon, - + contentType: item.primaryCategory, name: item.name, primaryCategory: item.primaryCategory, lastUpdatedOn: timeAgo(item.lastUpdatedOn), @@ -188,35 +197,37 @@ const AllContentsPage = () => { - - All My Contents + + + All My Contents + + {/* Here you see all your content. */} + + + + + + + {loading ? ( + + ) : contentList && contentList.length > 0 ? ( + contentList && + contentList.length > 0 && ( + <> + + + + + ) + ) : ( + + )} - {/* Here you see all your content. */} - - - - - - - {loading ? ( - - ) : contentList && contentList.length > 0 ? ( - contentList && - contentList.length > 0 && ( - <> - - - - - ) - ) : ( - - )} diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index 8cefb64..a620a12 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -127,38 +127,39 @@ const CreatePage = () => { flexWrap="wrap" > - {cardData.map((card, index) => ( - - - {card?.icon} - - {card?.title} - - - {card?.description} - - - - ))} + {cardData.map((card, index) => ( + + + {card?.icon} + + {card?.title} + + + {card?.description} + + + + ))} - + diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 33de991..690158a 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -27,11 +27,11 @@ import Paper from '@mui/material/Paper'; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, - { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, - { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "150px" }, + { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, ] diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 8b7149c..d8e6845 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -27,10 +27,10 @@ import { timeAgo } from "@/utils/Helper"; const columns = [ { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, - { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, - { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, + { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'Status', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "100px" }, + { key: 'action', title: 'Action', dataType: DataType.String, width: "100px" }, ] diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index d615e48..0c176ba 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -25,11 +25,11 @@ import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "300px" }, - { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "300px" }, - { key: 'action', title: 'Action', dataType: DataType.String, width: "200px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "100px" }, + { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, ] diff --git a/src/styles/global.css b/src/styles/global.css index cf13d2d..1f66d5a 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -75,4 +75,20 @@ h6, span, p .css-1ydl6z0-MuiTypography-root { font-family: Poppins, sans-serif !important; +} + +.two-line-text { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.one-line-text { + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; } \ No newline at end of file diff --git a/src/utils/app.constant.ts b/src/utils/app.constant.ts index 1452f57..986a027 100644 --- a/src/utils/app.constant.ts +++ b/src/utils/app.constant.ts @@ -10,7 +10,7 @@ export enum ContentType { export const SortOptions = ["Modified On", "Created On"]; -export const LIMIT = 6; +export const LIMIT = 10; export const ChannelID = "test-k12-channel"; export const PrimaryCategoryValue = [ From f0f3f56930bff07efdf88aa74dc378966a92eb18 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Fri, 15 Nov 2024 19:12:00 +0530 Subject: [PATCH 070/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/KaTableComponent.tsx | 4 ++-- src/pages/workspace/content/allContents/index.tsx | 2 +- src/pages/workspace/content/draft/index.tsx | 2 +- src/pages/workspace/content/publish/index.tsx | 10 +++++----- src/pages/workspace/content/submitted/index.tsx | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 22df45c..4b9db53 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -178,7 +178,7 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel {/* */} Image @@ -208,7 +208,7 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel Image diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 1593009..83bf6b2 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -39,7 +39,7 @@ const columns = [ { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, - { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'contentAction', title: 'ACTION', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 690158a..e9b58eb 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -30,7 +30,7 @@ const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, - { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "150px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index d8e6845..8cdda76 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -26,11 +26,11 @@ import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; const columns = [ - { key: 'title_and_description', title: 'Title & Description', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'Content Type', dataType: DataType.String, width: "250px" }, - { key: 'status', title: 'Status', dataType: DataType.String, width: "100px" }, - { key: 'lastUpdatedOn', title: 'Last Modified', dataType: DataType.String, width: "100px" }, - { key: 'action', title: 'Action', dataType: DataType.String, width: "100px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, + { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, ] diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 0c176ba..4ac5fe7 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -28,7 +28,7 @@ const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, - { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, From 3c2021b8bed9bc48700fb1f7498fcd87b7d51d1f Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Fri, 15 Nov 2024 19:26:35 +0530 Subject: [PATCH 071/126] Issue #PS-2512 feat: Removed hardcoded framework and cloudstorage url --- .env | 2 +- next.config.js | 2 +- src/components/CollectionEditor.tsx | 6 +++--- src/components/GenericEditor.tsx | 3 ++- src/components/QuestionSetEditor.tsx | 6 +++--- src/components/editor.config.json | 2 +- src/utils/app.config.ts | 14 ++++++++++++-- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/.env b/.env index 97fbce0..d3b3446 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ BASE_URL="" # Middleware Path - eg : "https://middleware.prathamdigital.org" AUTH_API_TOKEN="" # User Auth Access Token NEXT_PUBLIC_TENANT_ID="" # Tenant Id of User -CLOUD_STORAGE_URL="" #Use environment variable for S3 Cloud Storage URL \ No newline at end of file +NEXT_PUBLIC_CLOUD_STORAGE_URL="" #Use environment variable for S3 Cloud Storage URL \ No newline at end of file diff --git a/next.config.js b/next.config.js index 6ea2ad9..11acc4a 100644 --- a/next.config.js +++ b/next.config.js @@ -62,7 +62,7 @@ const nextConfig = { }, { source: "/assets/public/:path*", // Match any URL starting with /assets/public/ - destination: `${process.env.CLOUD_STORAGE_URL}/:path*`, // Forward to S3, stripping "/assets/public" + destination: `${process.env.NEXT_PUBLIC_CLOUD_STORAGE_URL}/:path*`, // Forward to S3, stripping "/assets/public" }, { source: "/workspace/content/assets/:path*", // Match any URL starting with /workspace/content/assets/ diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 5a99f25..03bef67 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; -import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; +import { TENANT_ID, CHANNEL_ID, FRAMEWORK_ID, CLOUD_STORAGE_URL } from "@/utils/app.config"; import { getLocalStoredUserName, getLocalStoredUserId } from "@/services/LocalStorageService"; const CollectionEditor: React.FC = () => { const router = useRouter(); @@ -34,7 +34,7 @@ const CollectionEditor: React.FC = () => { }, identifier: identifier, channel: CHANNEL_ID, - framework: "test_k12_framework", + framework: FRAMEWORK_ID, sid: uuidv4(), did: deviceId, uid: getLocalStoredUserId() || TENANT_ID, @@ -60,7 +60,7 @@ const CollectionEditor: React.FC = () => { defaultLicense: "CC BY 4.0", endpoint: "/data/v3/telemetry", env: "collection_editor", - cloudStorageUrls: ["https://knowlg-public.s3-ap-south-1.amazonaws.com/"], + cloudStorageUrls: [CLOUD_STORAGE_URL], }, config: { mode: mode || "edit", // edit / review / read / sourcingReview diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index a11cae4..c073bc6 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -6,7 +6,7 @@ import 'izimodal/css/iziModal.css'; import 'izimodal/js/iziModal.js'; import editorConfig from './editor.config.json'; import { getLocalStoredUserId, getLocalStoredUserName } from "@/services/LocalStorageService"; -import { CHANNEL_ID, TENANT_ID } from "@/utils/app.config"; +import { CHANNEL_ID, FRAMEWORK_ID, TENANT_ID } from "@/utils/app.config"; const GenericEditor: React.FC = () => { const router = useRouter(); @@ -109,6 +109,7 @@ const GenericEditor: React.FC = () => { window['context'].contextRollUp.l1 = CHANNEL_ID; window['context'].tags = [CHANNEL_ID]; window['context'].channel = CHANNEL_ID; + window['context'].framework = FRAMEWORK_ID; if (isLargeFileUpload || (_.get(data, 'contentDisposition') === 'online-only')) { window.context['uploadInfo'] = { isLargeFileUpload: true diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index fe09c45..511883f 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { v4 as uuidv4 } from "uuid"; -import { TENANT_ID, CHANNEL_ID } from "@/utils/app.config"; +import { TENANT_ID, CHANNEL_ID, FRAMEWORK_ID, CLOUD_STORAGE_URL } from "@/utils/app.config"; import { getLocalStoredUserId, getLocalStoredUserName } from "@/services/LocalStorageService"; const QuestionSetEditor: React.FC = () => { const router = useRouter(); @@ -58,8 +58,8 @@ const QuestionSetEditor: React.FC = () => { defaultLicense: "CC BY 4.0", endpoint: "/data/v3/telemetry", env: "questionset_editor", - framework: "test_k12_framework", - cloudStorageUrls: ["https://knowlg-public.s3-ap-south-1.amazonaws.com/"], + framework: FRAMEWORK_ID, + cloudStorageUrls: [CLOUD_STORAGE_URL], labels: { save_collection_btn_label: "Save as Draft", }, diff --git a/src/components/editor.config.json b/src/components/editor.config.json index 8add592..31a5d33 100644 --- a/src/components/editor.config.json +++ b/src/components/editor.config.json @@ -102,7 +102,7 @@ ], "channel": "", "env": "generic-editor", - "framework": "test_k12_framework", + "framework": "", "ownershipType": [ "createdBy", "createdFor" diff --git a/src/utils/app.config.ts b/src/utils/app.config.ts index b960ec1..8876abf 100644 --- a/src/utils/app.config.ts +++ b/src/utils/app.config.ts @@ -21,12 +21,22 @@ export const MIME_TYPE = { "video/youtube"] }; -export const TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID || ''; +export const TENANT_ID = process.env.NEXT_PUBLIC_TENANT_ID || ""; if (!TENANT_ID) { console.warn('NEXT_PUBLIC_TENANT_ID is not set in the environment variables.'); } -export const CHANNEL_ID = process.env.NEXT_PUBLIC_CHANNEL_ID || ''; +export const CHANNEL_ID = process.env.NEXT_PUBLIC_CHANNEL_ID || ""; if (!CHANNEL_ID) { console.warn('NEXT_PUBLIC_CHANNEL_ID is not set in the environment variables.'); } + +export const FRAMEWORK_ID = process.env.NEXT_PUBLIC_FRAMEWORK_ID || ""; +if (!FRAMEWORK_ID) { + console.warn('NEXT_PUBLIC_FRAMEWORK_ID is not set in the environment variables.'); +} + +export const CLOUD_STORAGE_URL = process.env.NEXT_PUBLIC_CLOUD_STORAGE_URL || ""; +if (!CLOUD_STORAGE_URL) { + console.warn('NEXT_PUBLIC_CLOUD_STORAGE_URL is not set in the environment variables.'); +} \ No newline at end of file From f694e9b278b850e6e77eb98357b5f635c3842bf0 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 15 Nov 2024 19:44:04 +0530 Subject: [PATCH 072/126] Issue feat:Modify delete functionality and optimize code --- src/components/ActionIcon.tsx | 59 ++++++++++++ src/components/DeleteConfirmation.tsx | 84 +++++++++++++++++ src/components/KaTableComponent.tsx | 89 +++++++++---------- src/components/tableColumns.ts | 43 +++++++++ .../workspace/content/allContents/index.tsx | 26 +----- src/pages/workspace/content/draft/index.tsx | 20 +---- src/pages/workspace/content/publish/index.tsx | 7 +- .../workspace/content/submitted/index.tsx | 7 +- src/services/ContentService.ts | 4 +- 9 files changed, 237 insertions(+), 102 deletions(-) create mode 100644 src/components/ActionIcon.tsx create mode 100644 src/components/DeleteConfirmation.tsx create mode 100644 src/components/tableColumns.ts diff --git a/src/components/ActionIcon.tsx b/src/components/ActionIcon.tsx new file mode 100644 index 0000000..6124e6f --- /dev/null +++ b/src/components/ActionIcon.tsx @@ -0,0 +1,59 @@ +import React, { useState } from "react"; +import { Box, Typography, Tooltip, useTheme } from "@mui/material"; +import DeleteConfirmation from "./DeleteConfirmation"; + +interface ActionCellProps { + rowData?: any; +} + +const ActionIcon: React.FC = ({ + rowData, + // onEdit, +}) => { + const theme = useTheme(); + const [open, setOpen] = useState(false); + const handleClose = () => { + setOpen(false); + }; + const handleOpen = () => { + setOpen(true); + }; + return ( + + + { + console.log(rowData); + + handleOpen(); + }} + sx={{ + display: "flex", + flexDirection: "column", + alignItems: "center", + cursor: "pointer", + backgroundColor: "#F8EFE7", + p: "10px", + }} + > + Image + + + + + + ); +}; + +export default ActionIcon; diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx new file mode 100644 index 0000000..32d060c --- /dev/null +++ b/src/components/DeleteConfirmation.tsx @@ -0,0 +1,84 @@ +import React from "react"; +import { + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + Button, + IconButton, + Typography, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import { deleteContent } from "@/services/ContentService"; + +interface DeleteConfirmationProps { + open: boolean; + handleClose: any; + rowData?: any; +} + +const DeleteConfirmation: React.FC = ({ + open, + rowData, + handleClose, +}) => { + const handleDelete = async (content?: any) => { + console.log(`Deleting item at index`, rowData); + + if (rowData?.identifier && rowData?.mimeType) { + try { + await deleteContent(rowData?.identifier, rowData?.mimeType); + console.log(`Deleted item with identifier - ${rowData?.identifier}`); + // setContentDeleted((prev) => !prev); + } catch (error) { + console.error("Failed to delete content:", error); + } + } + handleClose(); + }; + return ( + + + Confirm Deletion + theme.palette.grey[500], + }} + > + + + + + + Are you sure you want to delete this item? + + + + + + + + ); +}; + +export default DeleteConfirmation; diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 4b9db53..3d85803 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Table as KaTable } from 'ka-table'; import { DataType, EditingMode, SortingMode } from 'ka-table/enums'; import { Typography, useTheme, IconButton, Box } from '@mui/material'; @@ -8,7 +8,8 @@ import DeleteIcon from "@mui/icons-material/Delete"; import router from "next/router"; import { MIME_TYPE } from "@/utils/app.config"; import Image from "next/image"; - +import ActionIcon from './ActionIcon'; +import { deleteContent } from '@/services/ContentService'; interface CustomTableProps { data: any[]; // Define a more specific type for your data if needed columns: Array<{ @@ -20,9 +21,14 @@ interface CustomTableProps { tableTitle?: string } -const KaTableComponent: React.FC = ({ data, columns, handleDelete, tableTitle }) => { +const KaTableComponent: React.FC = ({ data, columns, tableTitle }) => { const theme = useTheme(); + const [open, setOpen] = useState(false); + const handleClose = () => { + setOpen(false); + }; + const handleOpen = () => setOpen(true); const openEditor = (content: any) => { const identifier = content?.identifier; @@ -68,10 +74,24 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel } }; - + const handleDelete = async(content: any) => { + console.log(`Deleting item at index`, content); + + if (content?.identifier && content?.mimeType) { + try { + await deleteContent(content?.identifier, content?.mimeType); + console.log(`Deleted item with identifier - ${content?.identifier}`); + // setContentDeleted((prev) => !prev); + } catch (error) { + console.error("Failed to delete content:", error); + } + } + handleClose(); + }; return ( - + = ({ data, columns, handleDel else if (props.column.key === 'contentAction') { if (props.rowData.status === "Draft") { return ( - - - - {/* */} - Image - - - + <> + + + + + ); } } @@ -193,34 +197,25 @@ const KaTableComponent: React.FC = ({ data, columns, handleDel return ( - - - Image - /> - ); } - return props.children; // Default content for other columns + return props.children; }, }, }} /> + + ); }; diff --git a/src/components/tableColumns.ts b/src/components/tableColumns.ts new file mode 100644 index 0000000..4bc9fc6 --- /dev/null +++ b/src/components/tableColumns.ts @@ -0,0 +1,43 @@ +import { DataType, SortDirection } from "ka-table"; + +interface ColumnConfig { + key: string; + titleKey: string; + width?: number; + sortDirection?: SortDirection; + isSortable?: boolean; +} + +const generateColumns = ( + configs: ColumnConfig[], + isMobile: boolean +) => { + return configs.map((config) => ({ + key: config.key, + title: (config.titleKey).toUpperCase(), + dataType: DataType.String, + sortDirection: config.sortDirection, + width: isMobile && config.width ? config.width : config.width || undefined, + isSortable: config.isSortable, + })); +}; + +export const getDraftTableColumns = ( isMobile: boolean) => { + + + + const configs: ColumnConfig[] = [ + { key: 'title_and_description', titleKey: 'Title & Description',width:700 }, + { key: 'contentType', titleKey: 'Content Type',width:700 }, + { key: 'status', titleKey: 'Status', width:90}, + { key: 'lastUpdatedOn', titleKey: 'Last Modified', width:90}, + { key: 'action', titleKey: 'Action', width:300}, + + ]; + // Conditionally add the "actions" column if isActiveYear is true + + + + return generateColumns( configs, isMobile); +}; + diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 83bf6b2..eb351c6 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -95,18 +95,6 @@ const AllContentsPage = () => { setSortBy(sortBy); }; - const openEditor = (content: any) => { - const identifier = content?.identifier; - const mode = content?.mode; - if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { - router.push({ pathname: `/editor`, query: { identifier, mode } }); - } else if ( - content?.mimeType && - MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) - ) { - router.push({ pathname: `/upload-editor`, query: { identifier } }); - } - }; useEffect(() => { const getContentList = async () => { @@ -166,19 +154,7 @@ const AllContentsPage = () => { console.log(filteredArray) }, [contentList]); - const handleDeleteClick = async (content: any) => { - if (content?.identifier && content?.mimeType) { - try { - await deleteContent(content?.identifier, content?.mimeType); - console.log(`Deleted item with identifier - ${content?.identifier}`); - setTimeout(() => { - setContentDeleted((prev) => !prev); - }, 1000); - } catch (error) { - console.error("Failed to delete content:", error); - } - } - }; + const filteredData = useMemo( () => diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index e9b58eb..da0c98d 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -97,23 +97,7 @@ const DraftPage = () => { const router = useRouter(); - const openEditor = (content: any) => { - const identifier = content?.identifier; - const mode = content?.mode; - if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { - router.push({ pathname: `/editor`, query: { identifier, mode } }); - } else if ( - content?.mimeType && - MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) - ) { - router.push({ pathname: `/upload-editor`, query: { identifier } }); - } else if ( - content?.mimeType && - MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) - ) { - router.push({ pathname: `/collection`, query: { identifier, mode } }); - } - }; + useEffect(() => { const getDraftContentList = async () => { @@ -178,7 +162,7 @@ const DraftPage = () => { ) : contentList && contentList.length > 0 ? ( - + ) : ( diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 8cdda76..2081472 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -90,10 +90,7 @@ const PublishPage = () => { setSortBy(sortBy); }; - const handleDelete = (index: number) => { - console.log(`Deleting item at index ${index}`); - setContentDeleted((prev) => !prev); - }; + const openEditor = (content: any) => { const identifier = content?.identifier; @@ -166,7 +163,7 @@ const PublishPage = () => { ) : contentList && contentList.length > 0 ? ( - + ) : ( diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 4ac5fe7..b94112e 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -84,10 +84,7 @@ const SubmittedForReviewPage = () => { setSortBy(sortBy); }; - const handleDelete = (index: number) => { - console.log(`Deleting item at index ${index}`); - setContentDeleted((prev) => !prev); - }; + useEffect(() => { const getReviewContentList = async () => { @@ -174,7 +171,7 @@ const SubmittedForReviewPage = () => { ) : contentList && contentList.length > 0 ? ( - + ) : ( diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index f8b85cf..52d0c2b 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -137,8 +137,8 @@ export const deleteContent = async (identifier: string, mimeType: string) => { if (mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { apiURL = questionsetRetireURL; } else if ( - mimeType !== MIME_TYPE.QUESTIONSET_MIME_TYPE && - mimeType !== MIME_TYPE.COLLECTION_MIME_TYPE + mimeType !== MIME_TYPE.QUESTIONSET_MIME_TYPE + // mimeType !== MIME_TYPE.COLLECTION_MIME_TYPE ) { apiURL = contentRetireURL; } From 0378d23d998b961079c4be58727fce8e7b1d75c3 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 15 Nov 2024 19:45:47 +0530 Subject: [PATCH 073/126] update pr:delete unwanted file --- src/components/tableColumns.ts | 43 ---------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 src/components/tableColumns.ts diff --git a/src/components/tableColumns.ts b/src/components/tableColumns.ts deleted file mode 100644 index 4bc9fc6..0000000 --- a/src/components/tableColumns.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { DataType, SortDirection } from "ka-table"; - -interface ColumnConfig { - key: string; - titleKey: string; - width?: number; - sortDirection?: SortDirection; - isSortable?: boolean; -} - -const generateColumns = ( - configs: ColumnConfig[], - isMobile: boolean -) => { - return configs.map((config) => ({ - key: config.key, - title: (config.titleKey).toUpperCase(), - dataType: DataType.String, - sortDirection: config.sortDirection, - width: isMobile && config.width ? config.width : config.width || undefined, - isSortable: config.isSortable, - })); -}; - -export const getDraftTableColumns = ( isMobile: boolean) => { - - - - const configs: ColumnConfig[] = [ - { key: 'title_and_description', titleKey: 'Title & Description',width:700 }, - { key: 'contentType', titleKey: 'Content Type',width:700 }, - { key: 'status', titleKey: 'Status', width:90}, - { key: 'lastUpdatedOn', titleKey: 'Last Modified', width:90}, - { key: 'action', titleKey: 'Action', width:300}, - - ]; - // Conditionally add the "actions" column if isActiveYear is true - - - - return generateColumns( configs, isMobile); -}; - From d0af777bfc67d0f6312a48bab9eb25dd312912b0 Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Sat, 16 Nov 2024 10:16:32 +0530 Subject: [PATCH 074/126] Issue #PS-2512 feat: Handling editor events for routing --- src/components/CollectionEditor.tsx | 3 ++- src/components/QuestionSetEditor.tsx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/CollectionEditor.tsx b/src/components/CollectionEditor.tsx index 03bef67..7505723 100644 --- a/src/components/CollectionEditor.tsx +++ b/src/components/CollectionEditor.tsx @@ -233,7 +233,8 @@ const CollectionEditor: React.FC = () => { "editorEmitter", (event: any) => { console.log("Editor event:", event); - if (event.detail?.action === "backContent") { + if (event.detail?.action === "backContent" || event.detail?.action === "submitContent" || + event.detail?.action === "publishContent" || event.detail?.action === "rejectContent") { window.history.back(); window.addEventListener( "popstate", diff --git a/src/components/QuestionSetEditor.tsx b/src/components/QuestionSetEditor.tsx index 511883f..0b63c18 100644 --- a/src/components/QuestionSetEditor.tsx +++ b/src/components/QuestionSetEditor.tsx @@ -181,7 +181,8 @@ const QuestionSetEditor: React.FC = () => { "editorEmitter", (event: any) => { console.log("Editor event:", event); - if (event.detail?.action === "backContent") { + if (event.detail?.action === "backContent" || event.detail?.action === "submitContent" || + event.detail?.action === "publishContent" || event.detail?.action === "rejectContent") { window.history.back(); window.addEventListener( "popstate", From 1d459a590b2362d0edb4360bf3114b33a69d539b Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Sat, 16 Nov 2024 10:41:01 +0530 Subject: [PATCH 075/126] Issue #PS-2512 feat: Updating env details --- .env | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.env b/.env index d3b3446..13319b8 100644 --- a/.env +++ b/.env @@ -1,4 +1,6 @@ BASE_URL="" # Middleware Path - eg : "https://middleware.prathamdigital.org" AUTH_API_TOKEN="" # User Auth Access Token NEXT_PUBLIC_TENANT_ID="" # Tenant Id of User -NEXT_PUBLIC_CLOUD_STORAGE_URL="" #Use environment variable for S3 Cloud Storage URL \ No newline at end of file +NEXT_PUBLIC_CLOUD_STORAGE_URL="" # Use environment variable for S3 Cloud Storage URL - should have / at the end. +NEXT_PUBLIC_CHANNEL_ID="" # Channel Id of knowlg-inQuiry setup +NEXT_PUBLIC_FRAMEWORK_ID="" # Framework Id of knowlg-inQuiry setup From 044b665b4172d2ece2bd9b98693092875dd92ea0 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Sat, 16 Nov 2024 18:51:56 +0530 Subject: [PATCH 076/126] Issue feat:Add searchbar in publish page --- package-lock.json | 39 ++++++++++++++++--- package.json | 9 +++-- src/components/ActionIcon.tsx | 3 +- src/components/DeleteConfirmation.tsx | 4 +- src/components/KaTableComponent.tsx | 22 ++--------- src/components/SearchBox.tsx | 2 +- .../workspace/content/allContents/index.tsx | 22 ++++------- src/pages/workspace/content/draft/index.tsx | 13 +++---- src/pages/workspace/content/publish/index.tsx | 28 +++++++------ src/pages/workspace/content/review/index.tsx | 8 +++- .../workspace/content/submitted/index.tsx | 20 ++++++---- 11 files changed, 97 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index 740f5b9..b5cbe86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,12 @@ "name": "adminpoc", "version": "0.1.0", "dependencies": { - "@emotion/react": "11.11.4", - "@emotion/styled": "11.11.5", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", "@module-federation/nextjs-mf": "^8.5.5", "@module-federation/utilities": "3.0.11", - "@mui/icons-material": "^5.15.20", - "@mui/material": "^5.16.0", + "@mui/icons-material": "^5.15.15", + "@mui/material": "^5.15.21", "@project-sunbird/sunbird-collection-editor-web-component": "^1.6.0", "async": "^3.2.5", "body-parser": "^1.20.2", @@ -40,7 +40,8 @@ "reflect-metadata": "^0.1.13", "svg2img": "^1.0.0-beta.2", "url": "^0.11.3", - "uuid": "^10.0.0" + "uuid": "^10.0.0", + "zustand": "^5.0.1" }, "devDependencies": { "@types/jquery": "^3.5.31", @@ -9100,6 +9101,34 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.1.tgz", + "integrity": "sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 5aaacfc..d61f7fc 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "lint": "next lint" }, "dependencies": { - "@module-federation/nextjs-mf": "^8.5.5", - "@module-federation/utilities": "3.0.11", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", + "@module-federation/nextjs-mf": "^8.5.5", + "@module-federation/utilities": "3.0.11", "@mui/icons-material": "^5.15.15", "@mui/material": "^5.15.21", "@project-sunbird/sunbird-collection-editor-web-component": "^1.6.0", @@ -41,7 +41,8 @@ "reflect-metadata": "^0.1.13", "svg2img": "^1.0.0-beta.2", "url": "^0.11.3", - "uuid": "^10.0.0" + "uuid": "^10.0.0", + "zustand": "^5.0.1" }, "devDependencies": { "@types/jquery": "^3.5.31", @@ -55,4 +56,4 @@ "typescript": "^5.6.2", "webpack": "^5.76.2" } -} \ No newline at end of file +} diff --git a/src/components/ActionIcon.tsx b/src/components/ActionIcon.tsx index 6124e6f..a244b20 100644 --- a/src/components/ActionIcon.tsx +++ b/src/components/ActionIcon.tsx @@ -12,6 +12,7 @@ const ActionIcon: React.FC = ({ }) => { const theme = useTheme(); const [open, setOpen] = useState(false); + const handleClose = () => { setOpen(false); }; @@ -27,7 +28,7 @@ const ActionIcon: React.FC = ({ alignItems: "center", }} > - + { console.log(rowData); diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 32d060c..5b604cb 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -23,6 +23,7 @@ const DeleteConfirmation: React.FC = ({ rowData, handleClose, }) => { + const handleDelete = async (content?: any) => { console.log(`Deleting item at index`, rowData); @@ -30,10 +31,11 @@ const DeleteConfirmation: React.FC = ({ try { await deleteContent(rowData?.identifier, rowData?.mimeType); console.log(`Deleted item with identifier - ${rowData?.identifier}`); - // setContentDeleted((prev) => !prev); + } catch (error) { console.error("Failed to delete content:", error); } + } handleClose(); }; diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 3d85803..4a507e9 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -9,7 +9,6 @@ import router from "next/router"; import { MIME_TYPE } from "@/utils/app.config"; import Image from "next/image"; import ActionIcon from './ActionIcon'; -import { deleteContent } from '@/services/ContentService'; interface CustomTableProps { data: any[]; // Define a more specific type for your data if needed columns: Array<{ @@ -73,23 +72,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl router.push({ pathname: `/collection`, query: { identifier, mode } }); } }; - - const handleDelete = async(content: any) => { - console.log(`Deleting item at index`, content); - - if (content?.identifier && content?.mimeType) { - try { - await deleteContent(content?.identifier, content?.mimeType); - console.log(`Deleted item with identifier - ${content?.identifier}`); - // setContentDeleted((prev) => !prev); - } catch (error) { - console.error("Failed to delete content:", error); - } - } - handleClose(); - }; - - return ( + return ( <> = ({ data, columns, tableTitl }, }, }} + noData={{ + text:data && data?.length === 0 ? "No data found" :"No data found", + }} /> diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index cabe4bd..deb9cab 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -42,7 +42,7 @@ const SearchBox: React.FC = ({ const theme = useTheme(); const [searchTerm, setSearchTerm] = useState(value); const [selectedFilters, setSelectedFilters] = useState([]); - const [sortBy, setSortBy] = useState(""); + const [sortBy, setSortBy] = useState("Modified On"); const [primaryCategory, setPrimaryCategory] = useState(); useEffect(() => { diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index eb351c6..f301dbd 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -52,8 +52,8 @@ const AllContentsPage = () => { const [rowsPerPage, setRowsPerPage] = useState(10); const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); - const [sortBy, setSortBy] = useState("updated"); - const [contentList, setContentList] = React.useState([]); + const [sortBy, setSortBy] = useState("Modified On"); + const [contentList, setContentList] = React.useState([]); const [data, setData] = React.useState([]); const [loading, setLoading] = useState(false); @@ -61,7 +61,7 @@ const AllContentsPage = () => { const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); const [totalCount, setTotalCount] = useState(0); - + const handleChangePage = (event: unknown, newPage: number) => { setPage(newPage - 1); }; @@ -92,6 +92,7 @@ const AllContentsPage = () => { }; const handleSortChange = (sortBy: string) => { + console.log("sortBy", sortBy) setSortBy(sortBy); }; @@ -135,7 +136,7 @@ const AllContentsPage = () => { } }; getContentList(); - }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, page]); useEffect(() => { const filteredArray = contentList.map(item => ({ @@ -187,21 +188,14 @@ const AllContentsPage = () => { onSortChange={handleSortChange} /> - - - {loading ? ( + {loading ? ( - ) : contentList && contentList.length > 0 ? ( - contentList && - contentList.length > 0 && ( - <> + ) : ( + <> - ) - ) : ( - )} diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index da0c98d..087a884 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -41,7 +41,7 @@ const DraftPage = () => { const [rowsPerPage, setRowsPerPage] = useState(5); const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); - const [sortBy, setSortBy] = useState("updated"); + const [sortBy, setSortBy] = useState("Modified On"); const [contentList, setContentList] = React.useState([]); const [contentDeleted, setContentDeleted] = React.useState(false); const [loading, setLoading] = useState(false); @@ -156,19 +156,16 @@ const DraftPage = () => { onSortChange={handleSortChange} /> - {loading ? ( + {loading ? ( - ) : contentList && contentList.length > 0 ? ( - + ) :(<> + - - ) : ( - + )} - {totalCount > LIMIT && ( { const [rowsPerPage, setRowsPerPage] = useState(5); const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); - const [sortBy, setSortBy] = useState("updated"); + const [sortBy, setSortBy] = useState("Modified On"); const [contentList, setContentList] = React.useState([]); const [contentDeleted, setContentDeleted] = React.useState(false); const [loading, setLoading] = useState(false); @@ -153,24 +153,27 @@ const PublishPage = () => { > Published
+ + + + {/* Here you see all your published content. */} - - - {loading ? ( +{loading ? ( - ) : contentList && contentList.length > 0 ? ( - + ) : (<> + - ) : ( - - )} - - - {totalCount > LIMIT && ( + )} + {totalCount > LIMIT && ( { /> )} + ); diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index dc3d5db..49e6db7 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -17,6 +17,7 @@ import ReviewCommentPopup from "../../../../components/ReviewCommentPopup"; import { publishContent, submitComment } from "@/services/ContentService"; import Players from "@/components/players/Players"; import V1Player from "@/components/V1-Player/V1Player"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { playerConfig, V1PlayerConfig, @@ -134,7 +135,9 @@ const ReviewContentSubmissions = () => { year: "numeric", }); }; - + const handleBackClick = () => { + router.back(); + }; return ( { alignItems="center" mb={2} > + + + { const [selectedKey, setSelectedKey] = useState("submitted"); const [filter, setFilter] = useState([]); - const [sortBy, setSortBy] = useState("updated"); + const [sortBy, setSortBy] = useState("Modified On"); const [searchTerm, setSearchTerm] = useState(""); const [contentList, setContentList] = useState([]); const [loading, setLoading] = useState(false); @@ -165,7 +165,7 @@ const SubmittedForReviewPage = () => { - {loading ? ( + {/* {loading ? ( @@ -175,13 +175,17 @@ const SubmittedForReviewPage = () => { ) : ( + )} */} + {loading ? ( + + + + ) : ( + + + )} - - - - - - {totalCount > LIMIT && ( + {totalCount > LIMIT && ( Date: Sun, 17 Nov 2024 15:47:31 +0530 Subject: [PATCH 077/126] update pr --- src/components/KaTableComponent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 4a507e9..45a36a1 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -197,7 +197,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl }, }} noData={{ - text:data && data?.length === 0 ? "No data found" :"No data found", + text: "No data found", }} /> From 6ae20078b5da7e50b001cde39a9d1fb9a8c9d860 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Mon, 18 Nov 2024 10:28:25 +0530 Subject: [PATCH 078/126] Issue #PS-0000 fix: Updated favicon --- public/favicon.ico | Bin 25931 -> 137076 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..ba528a4af04d62a584ce0b8a3049142c40933827 100644 GIT binary patch literal 137076 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�pKrV7oAmr~E>e>Q*d@{r-=2~;E-N#G5Ao*z%g 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 z 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%0AW;H=|=q{7TsEwiM={;%G?l?Msdm-yRsRk?0f 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 bD8c$)fzB(*)ABR#P<~$2)Ym9ew|?+ntSYo_ literal 25931 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 LrJugUA?W`A8`#=m From 209e461b2d5afcea28795a185a71ad528f540acd Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Mon, 18 Nov 2024 14:35:37 +0530 Subject: [PATCH 079/126] Issue #PS-2512 feat: Updating generic-editor form to all SBMGCS fields --- src/pages/api/mocked-response.ts | 123 +++++++++++++------------------ 1 file changed, 50 insertions(+), 73 deletions(-) diff --git a/src/pages/api/mocked-response.ts b/src/pages/api/mocked-response.ts index e08c3b4..aa3f958 100644 --- a/src/pages/api/mocked-response.ts +++ b/src/pages/api/mocked-response.ts @@ -70,26 +70,12 @@ export const genericEditorSaveFormResponse = { "required": false, "visible": true }, - { - "code": "medium", - "dataType": "List", - "description": "Language", - "editable": true, - "index": 8, - "inputType": "select", - "label": "Language", - "name": "Langauge", - "placeholder": "Select Language", - "renderingHints": {}, - "required": false, - "visible": true - }, { "code": "audience", "dataType": "list", "description": "Audience", "editable": true, - "index": 8, + "index": 5, "inputType": "multiselect", "label": "Audience", "name": "Audience", @@ -106,10 +92,6 @@ export const genericEditorSaveFormResponse = { "key": "Administrator", "name": "Administrator" }, - { - "key": "Teacher", - "name": "Teacher" - }, { "key": "Other", "name": "Other" @@ -119,20 +101,6 @@ export const genericEditorSaveFormResponse = { "renderingHints": {}, "required": false, "visible": true - }, - { - "code": "attributions", - "dataType": "list", - "description": "Attributions", - "editable": true, - "index": 8, - "inputType": "text", - "label": "Attributions", - "name": "attribution", - "placeholder": "", - "renderingHints": {}, - "required": false, - "visible": true } ] }, @@ -186,7 +154,7 @@ export const genericEditorReviewFormResponse = { "inputType": "text", "label": "Title", "name": "Title", - "placeholder": "Enter Title For Book", + "placeholder": "Enter Title", "renderingHints": {}, "required": false, "visible": true @@ -219,19 +187,41 @@ export const genericEditorReviewFormResponse = { "visible": true }, { - "code": "board", + "code": "state", "visible": true, "depends": [ + "board", "medium", "gradeLevel", + "courseType", "subject", "topic" ], "editable": true, "dataType": "text", "renderingHints": {}, + "description": "State", + "index": 5, + "label": "State", + "required": true, + "name": "State", + "inputType": "select", + "placeholder": "State" + }, + { + "code": "board", + "visible": true, + "depends": [ + "medium", + "gradeLevel", + "courseType", + "subject" + ], + "editable": true, + "dataType": "text", + "renderingHints": {}, "description": "Board", - "index": 7, + "index": 6, "label": "Board/Syllabus", "required": true, "name": "Board/Syllabus", @@ -243,14 +233,14 @@ export const genericEditorReviewFormResponse = { "visible": true, "depends": [ "gradeLevel", - "subject", - "topic" + "courseType", + "subject" ], "editable": true, "dataType": "list", "renderingHints": {}, "description": "", - "index": 8, + "index": 7, "label": "Medium", "required": true, "name": "medium", @@ -261,14 +251,14 @@ export const genericEditorReviewFormResponse = { "code": "gradeLevel", "visible": true, "depends": [ - "subject", - "topic" + "courseType", + "subject" ], "editable": true, "dataType": "list", "renderingHints": {}, "description": "Class", - "index": 9, + "index": 8, "label": "Class", "required": true, "name": "Class", @@ -276,42 +266,43 @@ export const genericEditorReviewFormResponse = { "placeholder": "Select Class" }, { - "code": "subject", + "code": "courseType", "visible": true, "depends": [ - "topic" + "subject" ], "editable": true, "dataType": "list", "renderingHints": {}, "description": "", - "index": 10, - "label": "Subject", + "index": 9, + "label": "Course Type", "required": true, - "name": "Subject", + "name": "Course Type", "inputType": "multiselect", - "placeholder": "Select Subject" + "placeholder": "Course Type" }, { - "code": "medium", - "dataType": "list", - "description": "Language", + "code": "subject", + "visible": true, + "depends": [], "editable": true, - "index": 8, - "inputType": "select", - "label": "Language", - "name": "Langauge", - "placeholder": "Select Language", + "dataType": "list", "renderingHints": {}, - "required": false, - "visible": true + "description": "", + "index": 10, + "label": "Subject", + "required": true, + "name": "Subject", + "inputType": "multiselect", + "placeholder": "Select Subject" }, { "code": "audience", "dataType": "list", "description": "Audience", "editable": true, - "index": 8, + "index": 11, "inputType": "multiselect", "label": "Audience", "name": "Audience", @@ -337,20 +328,6 @@ export const genericEditorReviewFormResponse = { "renderingHints": {}, "required": false, "visible": true - }, - { - "code": "attributions", - "dataType": "list", - "description": "Attributions", - "editable": true, - "index": 8, - "inputType": "text", - "label": "Attributions", - "name": "attribution", - "placeholder": "", - "renderingHints": {}, - "required": false, - "visible": true } ] }, From 1dc4a2603072ce892e31b637e4b7e0f162c3d20d Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Mon, 18 Nov 2024 18:33:10 +0530 Subject: [PATCH 080/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/players/SunbirdPdfPlayer.tsx | 18 +++++++++++------- src/pages/workspace/content/create/index.tsx | 3 ++- src/styles/global.css | 1 - 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/players/SunbirdPdfPlayer.tsx b/src/components/players/SunbirdPdfPlayer.tsx index 3d28303..8e8fa4f 100644 --- a/src/components/players/SunbirdPdfPlayer.tsx +++ b/src/components/players/SunbirdPdfPlayer.tsx @@ -18,12 +18,14 @@ const SunbirdPdfPlayer = ({ playerConfig }: PlayerConfigProps) => { script.async = true; document.body.appendChild(script); - const link = document.createElement("link"); - link.rel = "stylesheet"; - link.href = - "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-pdf-player-web-component@1.4.0/styles.css"; - document.head.appendChild(link); - + if (!document.getElementById("sunbird-pdf-player-css")) { + const link = document.createElement("link"); + link.id = "sunbird-pdf-player-css"; + link.rel = "stylesheet"; + link.href = + "https://cdn.jsdelivr.net/npm/@project-sunbird/sunbird-pdf-player-web-component@1.4.0/styles.css"; + document.head.appendChild(link); + } const playerElement = sunbirdPdfPlayerRef.current; const handlePlayerEvent = (event: any) => { @@ -49,6 +51,8 @@ const SunbirdPdfPlayer = ({ playerConfig }: PlayerConfigProps) => { handleTelemetryEvent ); document.body.removeChild(script); + const pdfPlayerCss = document.getElementById("sunbird-pdf-player-css"); + if (pdfPlayerCss) document.head.removeChild(pdfPlayerCss); }; }, []); @@ -62,4 +66,4 @@ const SunbirdPdfPlayer = ({ playerConfig }: PlayerConfigProps) => { ); }; -export default SunbirdPdfPlayer; +export default SunbirdPdfPlayer; \ No newline at end of file diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index dd9d20a..c6098c3 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -139,13 +139,14 @@ const CreatePage = () => { cursor: "pointer", flex: "1 1 180px", // maxWidth: "220px", - minHeight: "114px", + // minHeight: "114px", border: "solid 1px #D0C5B4", boxShadow: 'none', "&:hover": { backgroundColor: theme.palette.action.hover, }, }} + className="create-card" > {card?.icon} diff --git a/src/styles/global.css b/src/styles/global.css index 1f66d5a..5ae10eb 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -72,7 +72,6 @@ h3, h4, h5, h6, -span, p .css-1ydl6z0-MuiTypography-root { font-family: Poppins, sans-serif !important; } From 6cfc4e8d4ec8bcb52fae1b61c367cbb47a637e02 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 18 Nov 2024 23:52:00 +0530 Subject: [PATCH 081/126] Issue feat 2557 to 2563:Fixes bugs and improvement --- src/components/DeleteConfirmation.tsx | 34 ++++++++++++++++--- src/components/KaTableComponent.tsx | 11 ++++-- src/components/SearchBox.tsx | 7 +++- src/components/SideBar.tsx | 28 +++++++++++---- .../workspace/content/allContents/index.tsx | 15 ++++++-- src/pages/workspace/content/draft/index.tsx | 8 +++-- src/pages/workspace/content/publish/index.tsx | 9 +++-- .../workspace/content/submitted/index.tsx | 9 +++-- src/utils/useSharedState.ts | 9 +++++ 9 files changed, 107 insertions(+), 23 deletions(-) create mode 100644 src/utils/useSharedState.ts diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 5b604cb..780171e 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -11,6 +11,7 @@ import { } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { deleteContent } from "@/services/ContentService"; +import useSharedStore from "@/utils/useSharedState"; interface DeleteConfirmationProps { open: boolean; @@ -23,7 +24,14 @@ const DeleteConfirmation: React.FC = ({ rowData, handleClose, }) => { + const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); + const setFetchContentAPI = useSharedStore( + (state: any) => state.setFetchContentAPI + ); const handleDelete = async (content?: any) => { console.log(`Deleting item at index`, rowData); @@ -31,10 +39,15 @@ const DeleteConfirmation: React.FC = ({ try { await deleteContent(rowData?.identifier, rowData?.mimeType); console.log(`Deleted item with identifier - ${rowData?.identifier}`); - + await delay(1000); + + // Update the fetchContentAPI state after the delay + setFetchContentAPI(!fetchContentAPI); } catch (error) { console.error("Failed to delete content:", error); } + // setFetchContentAPI(!fetchContentAPI) + } handleClose(); @@ -72,11 +85,24 @@ const DeleteConfirmation: React.FC = ({ - - diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 45a36a1..09224ac 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -30,10 +30,14 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl const handleOpen = () => setOpen(true); const openEditor = (content: any) => { + console.log("content", content) const identifier = content?.identifier; let mode = content?.mode; // default mode from content, can be overwritten by tableTitle switch (tableTitle) { case 'draft': + mode = !mode ? "edit" : mode; + + // Use draft-specific routing if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { router.push({ pathname: `/editor`, query: { identifier, mode } }); @@ -56,9 +60,12 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl case 'submitted': mode = "review"; break; + case 'all-content': + mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" + break; // Default case for "all-content" or any other values if mode is already defined in content default: - mode = mode || content?.mode; + mode = mode ||"read" ; break; } @@ -162,7 +169,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl } } else if (props.column.key === 'contentAction') { - if (props.rowData.status === "Draft") { + { return ( <> diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index deb9cab..bb6b790 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -80,7 +80,12 @@ const SearchBox: React.FC = ({ const handleChange = (event: React.ChangeEvent) => { const searchTerm = event.target.value; setSearchTerm(searchTerm); - handleSearch(searchTerm); + + if(searchTerm.length>=3) + { + handleSearch(searchTerm); + } + }; const handleFilterChange = (event: SelectChangeEvent) => { diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 3fe0641..dede050 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -20,7 +20,7 @@ import { } from "@mui/material"; import Image from "next/image"; import { useRouter } from "next/router"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import logo from "/public/logo.png"; @@ -44,10 +44,11 @@ interface SidebarProps { const Sidebar: React.FC = ({ selectedKey, onSelect }) => { const [drawerOpen, setDrawerOpen] = useState(false); + const [userRole, setUserRole] = useState(""); const router = useRouter(); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("md")); - + const handleNavigation = (key: string) => { console.log(key); router.push(`/workspace/content/${key}`); @@ -64,6 +65,20 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { const goBack = () => { router.push("/"); }; + useEffect(() => { + try { + const storedUserData = localStorage.getItem("adminInfo"); + if (storedUserData) { + const parsedData = JSON.parse(storedUserData); + setUserRole(parsedData?.role); + console.log("storedUserData", parsedData); + } else { + console.log("No adminInfo found in localStorage"); + } + } catch (error) { + console.error("Error parsing adminInfo from localStorage:", error); + } +}, []); const drawerContent = ( @@ -77,20 +92,21 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { paddingTop={"1rem"} > - - + { userRole!=="Content Creator" && userRole!=="Content Reviewer" && ( {/* temporary assume this role name came from backend auth apies */} + - Back to Main Page - + ) + } {isMobile && ( diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index f301dbd..925add5 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -28,6 +28,7 @@ import { Table as KaTable } from 'ka-table'; import { DataType } from 'ka-table/enums'; import "ka-table/style.css"; import KaTableComponent from "@/components/KaTableComponent"; +import useSharedStore from "@/utils/useSharedState"; // const columns = [ // { key: 'name', title: 'Content', dataType: DataType.String, width: "450px" }, // { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String, width: "300px" }, @@ -58,6 +59,9 @@ const AllContentsPage = () => { const [loading, setLoading] = useState(false); const [contentDeleted, setContentDeleted] = React.useState(false); + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); const [totalCount, setTotalCount] = useState(0); @@ -136,7 +140,7 @@ const AllContentsPage = () => { } }; getContentList(); - }, [debouncedSearchTerm, filter, sortBy, page]); + }, [debouncedSearchTerm, filter,fetchContentAPI, sortBy, page]); useEffect(() => { const filteredArray = contentList.map(item => ({ @@ -197,9 +201,16 @@ const AllContentsPage = () => { )} + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} - + diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 087a884..c59cb99 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -25,11 +25,11 @@ import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import Paper from '@mui/material/Paper'; import { timeAgo } from "@/utils/Helper"; +import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, - { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, @@ -47,6 +47,10 @@ const DraftPage = () => { const [loading, setLoading] = useState(false); const [totalCount, setTotalCount] = useState(0); const [data, setData] = React.useState([]); + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); @@ -128,7 +132,7 @@ const DraftPage = () => { } }; getDraftContentList(); - }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, contentDeleted, fetchContentAPI,page]); return ( diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 5e1e98c..5dbd646 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -24,11 +24,12 @@ import WorkspaceText from "@/components/WorkspaceText"; import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; +import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, - { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, @@ -46,7 +47,9 @@ const PublishPage = () => { const [loading, setLoading] = useState(false); const [totalCount, setTotalCount] = useState(0); const [data, setData] = React.useState([]); - + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); @@ -139,7 +142,7 @@ const PublishPage = () => { } }; getPublishContentList(); - }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy,fetchContentAPI, contentDeleted, page]); return ( diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 2553edb..f19d49e 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -24,10 +24,11 @@ import WorkspaceText from "@/components/WorkspaceText"; import { DataType } from 'ka-table/enums'; import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; +import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, - { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, @@ -45,7 +46,9 @@ const SubmittedForReviewPage = () => { const [page, setPage] = useState(0); const [totalCount, setTotalCount] = useState(0); const [data, setData] = React.useState([]); - + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); useEffect(() => { const handler = setTimeout(() => { setDebouncedSearchTerm(searchTerm); @@ -115,7 +118,7 @@ const SubmittedForReviewPage = () => { } }; getReviewContentList(); - }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + }, [debouncedSearchTerm, filter, sortBy, fetchContentAPI,contentDeleted, page]); const openEditor = (content: any) => { const identifier = content?.identifier; diff --git a/src/utils/useSharedState.ts b/src/utils/useSharedState.ts new file mode 100644 index 0000000..70a8247 --- /dev/null +++ b/src/utils/useSharedState.ts @@ -0,0 +1,9 @@ +import { create } from "zustand"; + +const useSharedStore = create((set) => ({ + fetchContentAPI: false, + setFetchContentAPI: (status: boolean) => + set({ fetchContentAPI: status }), +})); + +export default useSharedStore; From dc830f61c020bd52b0be246997dea192e3b9c2f4 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Tue, 19 Nov 2024 00:04:49 +0530 Subject: [PATCH 082/126] Revert back side bar changes --- src/components/SideBar.tsx | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index dede050..4bf44bd 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -20,7 +20,7 @@ import { } from "@mui/material"; import Image from "next/image"; import { useRouter } from "next/router"; -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import logo from "/public/logo.png"; @@ -44,11 +44,10 @@ interface SidebarProps { const Sidebar: React.FC = ({ selectedKey, onSelect }) => { const [drawerOpen, setDrawerOpen] = useState(false); - const [userRole, setUserRole] = useState(""); const router = useRouter(); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("md")); - + const handleNavigation = (key: string) => { console.log(key); router.push(`/workspace/content/${key}`); @@ -65,20 +64,6 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { const goBack = () => { router.push("/"); }; - useEffect(() => { - try { - const storedUserData = localStorage.getItem("adminInfo"); - if (storedUserData) { - const parsedData = JSON.parse(storedUserData); - setUserRole(parsedData?.role); - console.log("storedUserData", parsedData); - } else { - console.log("No adminInfo found in localStorage"); - } - } catch (error) { - console.error("Error parsing adminInfo from localStorage:", error); - } -}, []); const drawerContent = ( @@ -92,21 +77,20 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { paddingTop={"1rem"} > - { userRole!=="Content Creator" && userRole!=="Content Reviewer" && ( {/* temporary assume this role name came from backend auth apies */} - + + - Back to Main Page - ) - } + {isMobile && ( @@ -199,4 +183,4 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { ); }; -export default Sidebar; +export default Sidebar; \ No newline at end of file From 6f2e953b9259e5e4a132da3e4ec4d142d89908a6 Mon Sep 17 00:00:00 2001 From: vivek kasture Date: Tue, 19 Nov 2024 01:33:34 +0530 Subject: [PATCH 083/126] Issue #PS-0000 fix: Added generic editor popstate --- src/components/GenericEditor.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index c073bc6..67edec2 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -45,6 +45,21 @@ const GenericEditor: React.FC = () => { console.error('Error:', error); closeModal(); }); + + const popstateListener = (event: PopStateEvent) => { + window.location.hash = 'no'; + if (event.state) { + console.log('popstate', event.state); + alert('To close this resource, save and click the X icon'); + window.location.hash = 'no'; + } + }; + window.addEventListener('popstate', popstateListener); + + // Cleanup function + return () => { + window.removeEventListener('popstate', popstateListener); + }; } }, [identifier]); @@ -102,7 +117,7 @@ const GenericEditor: React.FC = () => { name: getLocalStoredUserName() || "Anonymous User", orgIds: [CHANNEL_ID], organisations: { - [CHANNEL_ID] : CHANNEL_ID + " Channel" + [CHANNEL_ID]: CHANNEL_ID + " Channel" } } window['context'].uid = getLocalStoredUserId() || TENANT_ID; From 19a36ce942cf8d78ef6bc6f201076200aa173f6c Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Tue, 19 Nov 2024 13:04:57 +0530 Subject: [PATCH 084/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/DeleteConfirmation.tsx | 41 ++++++++++--------- .../workspace/content/allContents/index.tsx | 7 +++- src/pages/workspace/content/create/index.tsx | 4 +- src/pages/workspace/content/draft/index.tsx | 2 +- src/pages/workspace/content/publish/index.tsx | 3 +- .../workspace/content/submitted/index.tsx | 2 +- 6 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 5b604cb..4b7ea4e 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -8,6 +8,8 @@ import { Button, IconButton, Typography, + Box, + Divider, } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { deleteContent } from "@/services/ContentService"; @@ -46,11 +48,18 @@ const DeleteConfirmation: React.FC = ({ aria-labelledby="delete-confirmation-title" aria-describedby="delete-confirmation-description" maxWidth="xs" - fullWidth + fullWidth + sx={{ + "& .MuiDialog-paper": { + borderRadius: "16px", + }, + }} > - - Confirm Deletion - + + Are you sure you want to delete this item? + + {/* = ({ }} > - + */} - - - Are you sure you want to delete this item? - - - - - diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index f301dbd..57e756f 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -165,16 +165,19 @@ const AllContentsPage = () => { [debouncedSearchTerm, contentList] ); + const displayedRows = filteredData.slice( page * rowsPerPage, page * rowsPerPage + rowsPerPage - ); + ); + console.log("contentList", contentList) return ( + - + LIMIT ? '15px' : '0px' }}> All My Contents diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index c6098c3..dd0c21a 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -79,7 +79,7 @@ const CreatePage = () => { { title: "New Course", description: - "Description about what this is and what the user can create.", + " Create courses by defining content, assessments, etc", icon: , onClick: openCollectionEditor, }, @@ -91,7 +91,7 @@ const CreatePage = () => { }, { title: "New Large Content", - description: "Videos and documents larger than 150 MB", + description: "Create videos and documents larger than 150mb ---- Create word needs to be added", icon: large-video, onClick: () => router.push({ diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index 087a884..0dd2302 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -135,7 +135,7 @@ const DraftPage = () => { - + LIMIT ? '15px' : '0px' }}> { getPublishContentList(); }, [debouncedSearchTerm, filter, sortBy, contentDeleted, page]); + return ( - + LIMIT ? '15px' : '0px' }} > { - + LIMIT ? '15px' : '0px' }}> Date: Wed, 20 Nov 2024 14:57:16 +0530 Subject: [PATCH 085/126] Issue feat PS-2550: Restrict the content creator and reviewer roles from navigating to the center when clicking the "Back to Main Page" option --- src/components/SideBar.tsx | 12 +++++++++- .../workspace/content/submitted/index.tsx | 22 +------------------ src/utils/app.constant.ts | 5 ++++- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 4bf44bd..ad11721 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -23,6 +23,7 @@ import { useRouter } from "next/router"; import React, { useState } from "react"; import logo from "/public/logo.png"; +import { Role } from "@/utils/app.constant"; // Updated menu items with icons const menuItems = [ @@ -61,9 +62,18 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { setDrawerOpen(!drawerOpen); }; + const goBack = () => { + if (typeof window !== "undefined" && window.localStorage) { + const userInfo = JSON.parse(localStorage.getItem("adminInfo") || "{}"); + console.log("userInfo", userInfo); + if (userInfo?.role === Role.SCTA || userInfo?.role === Role.CCTA) { + router.push("/course-planner"); + + } + else router.push("/"); - }; + }}; const drawerContent = ( diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index f19d49e..46d8af8 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -120,27 +120,7 @@ const SubmittedForReviewPage = () => { getReviewContentList(); }, [debouncedSearchTerm, filter, sortBy, fetchContentAPI,contentDeleted, page]); - const openEditor = (content: any) => { - const identifier = content?.identifier; - const mode = "review"; - if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { - router.push({ pathname: `/editor`, query: { identifier, mode } }); - } else if ( - content?.mimeType && - MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType) - ) { - router.push({ - pathname: `/workspace/content/review`, - query: { identifier, mode }, - }); - } else if ( - content?.mimeType && - MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType) - ) { - router.push({ pathname: `/collection`, query: { identifier, mode } }); - } - }; - + return ( diff --git a/src/utils/app.constant.ts b/src/utils/app.constant.ts index 986a027..c1eb523 100644 --- a/src/utils/app.constant.ts +++ b/src/utils/app.constant.ts @@ -7,7 +7,10 @@ export enum Status { export enum ContentType { QUESTION_SET = "QuestionSet", } - +export enum Role { + SCTA = "State Admin SCTA", + CCTA="Central Admin CCTA" +} export const SortOptions = ["Modified On", "Created On"]; export const LIMIT = 10; From b8d4d92c505563f522f1ef3b0e9dfd9140aa8ca1 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Wed, 20 Nov 2024 20:19:32 +0530 Subject: [PATCH 086/126] Issue feat:restrict routes according to SCTA and CCTA privilages --- .env | 12 +- next.config.js | 2 + src/components/KaTableComponent.tsx | 4 +- src/components/SideBar.tsx | 11 +- .../workspace/content/up-review/index.tsx | 186 ++++++++++++++++++ src/services/ContentService.ts | 38 +++- src/services/LocalStorageService.ts | 15 ++ 7 files changed, 252 insertions(+), 16 deletions(-) create mode 100644 src/pages/workspace/content/up-review/index.tsx diff --git a/.env b/.env index 13319b8..f1513bf 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -BASE_URL="" # Middleware Path - eg : "https://middleware.prathamdigital.org" -AUTH_API_TOKEN="" # User Auth Access Token -NEXT_PUBLIC_TENANT_ID="" # Tenant Id of User -NEXT_PUBLIC_CLOUD_STORAGE_URL="" # Use environment variable for S3 Cloud Storage URL - should have / at the end. -NEXT_PUBLIC_CHANNEL_ID="" # Channel Id of knowlg-inQuiry setup -NEXT_PUBLIC_FRAMEWORK_ID="" # Framework Id of knowlg-inQuiry setup +# BASE_URL=https://middleware.prathamdigital.org +# AUTH_API_TOKEN=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJha0d1WG1zVTVxMXhOczZxUkVTWWZkTkRyUWRiZ2ZGekRFMEswRkFDNUVzIn0.eyJleHAiOjE3MzE0MDYyMTcsImlhdCI6MTczMTMxOTgxNywianRpIjoiZDEzNTNiNmQtZmNjMC00ODI4LWFlYWYtNzA3MDlmNDZmOTJlIiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay5wcmF0aGFtZGlnaXRhbC5vcmcvYXV0aC9yZWFsbXMvcHJhdGhhbSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiIzZTBiZGE2Yi1jNTA2LTQ2NmYtODg3NS1lMzdkZTUyYTBlOGYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJwcmF0aGFtIiwic2Vzc2lvbl9zdGF0ZSI6ImRjYzk1Mjg4LWYwYjYtNDdhMS04ZWMxLWNjYWNhODc3ZDlhZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLXByYXRoYW0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJkY2M5NTI4OC1mMGI2LTQ3YTEtOGVjMS1jY2FjYTg3N2Q5YWYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJSYWh1bCIsInByZWZlcnJlZF91c2VybmFtZSI6InJhaHVsX3Rla2RpIiwiZ2l2ZW5fbmFtZSI6IlJhaHVsIiwiZmFtaWx5X25hbWUiOiIifQ.uv5gQi2IBdwOgNgplewjH0Ye7fWwf_ZNWz2dJmNHM5Ov8Fz29sHlxUYAm3aWSUKt6gwm-jIopxou7KpmdQQThZIRcq9_6eqoFLIUK15N_ntjqrsBkTw_rwHBn4Ih7vm7ZvhiquZdO6qr8M1fS9saNNtkpnk7QJj1x_sY-SW98zEjWeqNZ0j_PuUtTh7fUdY7CRgWwDPDkv6fnzTbo3s_s-vT-hOvLEvawb6aNAEPPf-111W6fCnh9mItc7hGVLGWBipEEIfotlnFK_tT7UaT09-80bGwQCyOPhdKZmtvyAWcZIw_ftzUTgq941AUwoIihH4YhDT8GY_wvI-R-2NUAg +# TENANT_ID=ef99949b-7f3a-4a5f-806a-e67e683e38f3 +# CLOUD_STORAGE_URL=https://knowlg-public.s3-ap-south-1.amazonaws.com +# NEXT_PRIVATE_LOCAL_WEBPACK=true + diff --git a/next.config.js b/next.config.js index 11acc4a..362f84a 100644 --- a/next.config.js +++ b/next.config.js @@ -130,6 +130,8 @@ const nextConfig = { "./Collection": "/src/pages/collection.tsx", "./SunbirdPlayers": "/src/pages/sunbirdPlayers.tsx", "./Review": "/src/pages/workspace/content/review/index.tsx", + "./UpReview": "/src/pages/workspace/content/up-review/index.tsx", + }, }) ); diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 09224ac..ddc2abc 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -59,6 +59,8 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl break; case 'submitted': mode = "review"; + case 'upForReview': + mode = "read"; break; case 'all-content': mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" @@ -73,7 +75,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { router.push({ pathname: `/editor`, query: { identifier, mode } }); } else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { - const pathname = tableTitle === 'submitted' ? `/workspace/content/review` : `/upload-editor`; + const pathname = tableTitle === 'upForReview' ? `/workspace/content/review` : `/upload-editor`; router.push({ pathname, query: { identifier, mode } }); } else if (content?.mimeType && MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType)) { router.push({ pathname: `/collection`, query: { identifier, mode } }); diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index ad11721..490ad34 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -24,16 +24,17 @@ import React, { useState } from "react"; import logo from "/public/logo.png"; import { Role } from "@/utils/app.constant"; +import { getLocalStoredUserRole } from "@/services/LocalStorageService"; +const userRole = getLocalStoredUserRole(); // Updated menu items with icons const menuItems = [ { text: "Create", key: "create", icon: }, { text: "Draft", key: "draft", icon: }, - { - text: "Submitted for Review", - key: "submitted", - icon: , - }, + { text: "Submitted for Review", key: "submitted", icon: }, + ...(userRole === Role.CCTA + ? [{ text: "Up for Review", key: "up-review", icon: }] + : []), { text: "Publish", key: "publish", icon: }, { text: "All My Contents", key: "allContents", icon: }, ]; diff --git a/src/pages/workspace/content/up-review/index.tsx b/src/pages/workspace/content/up-review/index.tsx new file mode 100644 index 0000000..7b8e1da --- /dev/null +++ b/src/pages/workspace/content/up-review/index.tsx @@ -0,0 +1,186 @@ +import React, { useEffect, useState } from "react"; +import Layout from "../../../../components/Layout"; +import { + Typography, + Box, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + IconButton, + CircularProgress, +} from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; +import { getContent } from "@/services/ContentService"; +import SearchBox from "../../../../components/SearchBox"; +import PaginationComponent from "@/components/PaginationComponent"; +import NoDataFound from "@/components/NoDataFound"; +import { LIMIT } from "@/utils/app.constant"; +import { MIME_TYPE } from "@/utils/app.config"; +import router from "next/router"; +import WorkspaceText from "@/components/WorkspaceText"; +import { DataType } from 'ka-table/enums'; +import KaTableComponent from "@/components/KaTableComponent"; +import { timeAgo } from "@/utils/Helper"; +import useSharedStore from "@/utils/useSharedState"; +const columns = [ + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, + { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, + + +] +const UpForReviewPage = () => { + const [selectedKey, setSelectedKey] = useState("submitted"); + const [filter, setFilter] = useState([]); + const [sortBy, setSortBy] = useState("Modified On"); + const [searchTerm, setSearchTerm] = useState(""); + const [contentList, setContentList] = useState([]); + const [loading, setLoading] = useState(false); + const [contentDeleted, setContentDeleted] = useState(false); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(searchTerm); + const [page, setPage] = useState(0); + const [totalCount, setTotalCount] = useState(0); + const [data, setData] = React.useState([]); + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedSearchTerm(searchTerm); + }, 300); + + return () => { + clearTimeout(handler); + }; + }, [searchTerm]); + useEffect(() => { + const filteredArray = contentList.map((item: any) => ({ + image: item?.appIcon, + + name: item?.name, + description: item?.description, + + contentType: item.primaryCategory, + lastUpdatedOn: timeAgo(item.lastUpdatedOn), + status: item.status, + identifier: item.identifier, + mimeType: item.mimeType, + mode: item.mode + })); + setData(filteredArray) + console.log(filteredArray) + }, [contentList]); + const handleSearch = (search: string) => { + setSearchTerm(search.toLowerCase()); + }; + + const handleFilterChange = (filter: string[]) => { + setFilter(filter); + }; + + const handleSortChange = (sortBy: string) => { + setSortBy(sortBy); + }; + + + + useEffect(() => { + const getReviewContentList = async () => { + try { + setLoading(true); + const query = debouncedSearchTerm || ""; + const offset = page * LIMIT; + const primaryCategory = filter.length ? filter : []; + const order = sortBy === "Created On" ? "asc" : "desc"; + const sort_by = { lastUpdatedOn: order }; + const contentType="upReview" + const response = await getContent( + ["Review", "FlagReview"], + query, + LIMIT, + offset, + primaryCategory, + sort_by, + contentType + ); + const contentList = (response?.content || []).concat( + response?.QuestionSet || [] + ); + setContentList(contentList); + setTotalCount(response?.count); + } catch (error) { + console.error(error); + } finally { + setLoading(false); + } + }; + getReviewContentList(); + }, [debouncedSearchTerm, filter, sortBy, fetchContentAPI,contentDeleted, page]); + + + return ( + + + + LIMIT ? '15px' : '0px' }}> + + + Up For Review + + + {/* + Here you can see all your content submitted for review. + */} + + + + + + + {/* {loading ? ( + + + + ) : contentList && contentList.length > 0 ? ( + + + + ) : ( + + )} */} + {loading ? ( + + + + ) : ( + + + + )} + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} + + + + ); +}; + +export default UpForReviewPage; diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index 27356ce..4ee184a 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -41,14 +41,24 @@ const defaultReqBody = { }, }, }; - +const upForReviewReqBody = { + request: { + filters: { + // createdBy: { userId}, + }, + sort_by: { + lastUpdatedOn: "desc", + }, + }, +} const getReqBodyWithStatus = ( status: string[], query: string, limit: number, offset: number, primaryCategory: any, - sort_by: any + sort_by: any, + contentType?: string ) => { if (typeof window !== "undefined" && typeof localStorage !== "undefined") { var PrimaryCategory = @@ -57,6 +67,24 @@ const getReqBodyWithStatus = ( } primaryCategory = primaryCategory.length === 0 ? PrimaryCategory : primaryCategory; +if(contentType==="upReview") +{ + return { + ...upForReviewReqBody, + request: { + ...upForReviewReqBody.request, + filters: { + ...upForReviewReqBody.request.filters, + status, + primaryCategory, + }, + query, + limit, + offset, + sort_by, + }, + }; +} return { ...defaultReqBody, @@ -81,7 +109,8 @@ export const getContent = async ( limit: number, offset: number, primaryCategory: string[], - sort_by: any + sort_by: any, + contentType?: string ) => { const apiURL = "/action/composite/v3/search"; try { @@ -91,7 +120,8 @@ export const getContent = async ( limit, offset, primaryCategory, - sort_by + sort_by, + contentType ); const response = await post(apiURL, reqBody); return response?.data?.result; diff --git a/src/services/LocalStorageService.ts b/src/services/LocalStorageService.ts index efa01df..9fc2f66 100644 --- a/src/services/LocalStorageService.ts +++ b/src/services/LocalStorageService.ts @@ -29,3 +29,18 @@ export const getLocalStoredUserName = () => { return null; } }; +export const getLocalStoredUserRole = () => { + if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') { + try { + const userInfo = JSON.parse(localStorage.getItem("adminInfo") || "{}"); + return userInfo?.role; + } catch (error) { + console.error("Error retrieving user name from local storage:", error); + return "Anonymous User"; + } + } else { + // Running in SSR, return null + console.warn("Local storage is not available (SSR)"); + return null; + } +}; From ac4bc7593c416bf54a488df6d96131ec7244a0c7 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Wed, 20 Nov 2024 20:24:02 +0530 Subject: [PATCH 087/126] update pr --- .env | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.env b/.env index f1513bf..d77491e 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -# BASE_URL=https://middleware.prathamdigital.org -# AUTH_API_TOKEN=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJha0d1WG1zVTVxMXhOczZxUkVTWWZkTkRyUWRiZ2ZGekRFMEswRkFDNUVzIn0.eyJleHAiOjE3MzE0MDYyMTcsImlhdCI6MTczMTMxOTgxNywianRpIjoiZDEzNTNiNmQtZmNjMC00ODI4LWFlYWYtNzA3MDlmNDZmOTJlIiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay5wcmF0aGFtZGlnaXRhbC5vcmcvYXV0aC9yZWFsbXMvcHJhdGhhbSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiIzZTBiZGE2Yi1jNTA2LTQ2NmYtODg3NS1lMzdkZTUyYTBlOGYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJwcmF0aGFtIiwic2Vzc2lvbl9zdGF0ZSI6ImRjYzk1Mjg4LWYwYjYtNDdhMS04ZWMxLWNjYWNhODc3ZDlhZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJkZWZhdWx0LXJvbGVzLXByYXRoYW0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJkY2M5NTI4OC1mMGI2LTQ3YTEtOGVjMS1jY2FjYTg3N2Q5YWYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJSYWh1bCIsInByZWZlcnJlZF91c2VybmFtZSI6InJhaHVsX3Rla2RpIiwiZ2l2ZW5fbmFtZSI6IlJhaHVsIiwiZmFtaWx5X25hbWUiOiIifQ.uv5gQi2IBdwOgNgplewjH0Ye7fWwf_ZNWz2dJmNHM5Ov8Fz29sHlxUYAm3aWSUKt6gwm-jIopxou7KpmdQQThZIRcq9_6eqoFLIUK15N_ntjqrsBkTw_rwHBn4Ih7vm7ZvhiquZdO6qr8M1fS9saNNtkpnk7QJj1x_sY-SW98zEjWeqNZ0j_PuUtTh7fUdY7CRgWwDPDkv6fnzTbo3s_s-vT-hOvLEvawb6aNAEPPf-111W6fCnh9mItc7hGVLGWBipEEIfotlnFK_tT7UaT09-80bGwQCyOPhdKZmtvyAWcZIw_ftzUTgq941AUwoIihH4YhDT8GY_wvI-R-2NUAg -# TENANT_ID=ef99949b-7f3a-4a5f-806a-e67e683e38f3 -# CLOUD_STORAGE_URL=https://knowlg-public.s3-ap-south-1.amazonaws.com -# NEXT_PRIVATE_LOCAL_WEBPACK=true - +BASE_URL="" # Middleware Path - eg : "https://middleware.prathamdigital.org" +AUTH_API_TOKEN="" # User Auth Access Token +NEXT_PUBLIC_TENANT_ID="" # Tenant Id of User +NEXT_PUBLIC_CLOUD_STORAGE_URL="" # Use environment variable for S3 Cloud Storage URL - should have / at the end. +NEXT_PUBLIC_CHANNEL_ID="" # Channel Id of knowlg-inQuiry setup +NEXT_PUBLIC_FRAMEWORK_ID="" # Framework Id of knowlg-inQuiry setup \ No newline at end of file From b826f620e88ed01d1cd6ad9a8fd4ea482f5255d2 Mon Sep 17 00:00:00 2001 From: Arif-tekdi-technologies Date: Thu, 21 Nov 2024 12:53:07 +0530 Subject: [PATCH 088/126] Modal bug fixes and delete button optimizations --- src/components/DeleteConfirmation.tsx | 68 ++++++++++++++++----------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 1e15b68..ba41da3 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -10,6 +10,7 @@ import { Typography, Box, Divider, + CircularProgress, } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { deleteContent } from "@/services/ContentService"; @@ -26,51 +27,53 @@ const DeleteConfirmation: React.FC = ({ rowData, handleClose, }) => { - const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); + const delay = (ms: number) => + new Promise((resolve) => setTimeout(resolve, ms)); - const fetchContentAPI = useSharedStore( - (state: any) => state.fetchContentAPI - ); + const [loading, setLoading] = React.useState(false); + + const fetchContentAPI = useSharedStore((state: any) => state.fetchContentAPI); const setFetchContentAPI = useSharedStore( (state: any) => state.setFetchContentAPI ); - const handleDelete = async (content?: any) => { - console.log(`Deleting item at index`, rowData); - - if (rowData?.identifier && rowData?.mimeType) { - try { + const handleDelete = async () => { + setLoading(true); + try { + if (rowData?.identifier && rowData?.mimeType) { await deleteContent(rowData?.identifier, rowData?.mimeType); console.log(`Deleted item with identifier - ${rowData?.identifier}`); - await delay(1000); - - // Update the fetchContentAPI state after the delay + await delay(1000); setFetchContentAPI(!fetchContentAPI); - } catch (error) { - console.error("Failed to delete content:", error); } - // setFetchContentAPI(!fetchContentAPI) - - + } catch (error) { + console.error("Failed to delete content:", error); } + setLoading(false); handleClose(); }; return ( { + if (reason !== "backdropClick") { + handleClose(); + } + }} aria-labelledby="delete-confirmation-title" aria-describedby="delete-confirmation-description" maxWidth="xs" - fullWidth + fullWidth sx={{ "& .MuiDialog-paper": { borderRadius: "16px", }, }} > - - - Are you sure you want to delete this item? + + + + Are you sure you want to delete this item? + {/* = ({ */} - - - + + + No, go back - From 3543b8c59fd242c1dcf1b740df3eda02f8d87a3e Mon Sep 17 00:00:00 2001 From: Rajnish Dargan Date: Thu, 21 Nov 2024 17:07:55 +0530 Subject: [PATCH 089/126] Issue #PS-2564 fix: Removing Sunbird logo from Editor --- src/components/GenericEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 67edec2..84e9869 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -138,7 +138,7 @@ const GenericEditor: React.FC = () => { if (typeof window !== 'undefined') { window['config'] = _.cloneDeep(editorConfig.GENERIC_EDITOR.WINDOW_CONFIG); window['config'].build_number = buildNumber; - window['config'].headerLogo = 'https://staging.sunbirded.org/assets/images/sunbird_logo.png'; + window['config'].headerLogo = '/logo.png'; window['config'].lock = {}; window['config'].extContWhitelistedDomains = extContWhitelistedDomains; window['config'].enableTelemetryValidation = false; From b0cbe8d7d40b2e6964bfdfe2facd336f213041a9 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Thu, 21 Nov 2024 23:09:17 +0530 Subject: [PATCH 090/126] Issue feat: fix sidebar select option issue --- src/components/KaTableComponent.tsx | 13 +++++++++---- src/pages/workspace/content/up-review/index.tsx | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index ddc2abc..c864324 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -58,10 +58,11 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl mode = "read"; break; case 'submitted': - mode = "review"; - case 'upForReview': mode = "read"; break; + case 'upForReview': + mode = "review"; + break; case 'all-content': mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" break; @@ -72,9 +73,13 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl } // Generic routing for cases other than 'draft' - if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE) { + if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE ) { router.push({ pathname: `/editor`, query: { identifier, mode } }); - } else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { + } + // else if (content?.mimeType === MIME_TYPE.COURSE_MIME_TYPE && tableTitle==='submitted') { + // router.push({ pathname: `/editor`, query: { identifier, mode } }); + // } + else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { const pathname = tableTitle === 'upForReview' ? `/workspace/content/review` : `/upload-editor`; router.push({ pathname, query: { identifier, mode } }); } else if (content?.mimeType && MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType)) { diff --git a/src/pages/workspace/content/up-review/index.tsx b/src/pages/workspace/content/up-review/index.tsx index 7b8e1da..d30d560 100644 --- a/src/pages/workspace/content/up-review/index.tsx +++ b/src/pages/workspace/content/up-review/index.tsx @@ -35,7 +35,7 @@ const columns = [ ] const UpForReviewPage = () => { - const [selectedKey, setSelectedKey] = useState("submitted"); + const [selectedKey, setSelectedKey] = useState("up-review"); const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("Modified On"); const [searchTerm, setSearchTerm] = useState(""); From 4c21495bcd9bb02027987b3842d771eeb580f3b0 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Thu, 21 Nov 2024 23:09:48 +0530 Subject: [PATCH 091/126] Issue #PS-2322 fix: Workspace UI improvements and Fixes --- src/components/Layout.tsx | 6 +-- src/components/SideBar.tsx | 42 +++++++++++++------- src/pages/workspace/content/create/index.tsx | 2 +- src/styles/global.css | 12 ------ 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 89dba99..9324838 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -11,12 +11,12 @@ interface LayoutProps { const Layout: React.FC = ({ children, selectedKey, onSelect }) => { return ( - + - {children} + {children} - ); + ) }; export default Layout; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 4bf44bd..d5fc798 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -66,7 +66,19 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { }; const drawerContent = ( - + logo @@ -85,8 +97,8 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { Back to Main Page @@ -110,10 +122,9 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { selectedKey === item.key ? "var(--mui-palette-primary-main)" : "transparent", - color: - selectedKey === item.key - ? "#2E1500" - : theme.palette.warning.A200, + color: "#000", + + fontSize: '16px !important' , "&:hover": { background: @@ -133,13 +144,13 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { ? "#2E1500" : theme.palette.warning.A200, minWidth: '40px', - fontWeight: selectedKey === item?.key ? '600' : 'normal', - fontSize: '14px !important' + fontWeight: selectedKey === item?.key ? '500' : '500', + fontSize: '16px !important' }} > {item?.icon} - + ))} @@ -155,6 +166,10 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { = ({ selectedKey, onSelect }) => { sx={{ display: "flex", justifyContent: "flex-start", - width: 250, - // height: "100vh", - bgcolor: theme.palette.background.paper, - borderRight: 1, - borderColor: theme.palette.divider, + width: 275, + }} > {drawerContent} diff --git a/src/pages/workspace/content/create/index.tsx b/src/pages/workspace/content/create/index.tsx index dd0c21a..6ade2af 100644 --- a/src/pages/workspace/content/create/index.tsx +++ b/src/pages/workspace/content/create/index.tsx @@ -108,7 +108,7 @@ const CreatePage = () => { {/* Outer box for "Create new content" heading and cards */} Date: Fri, 22 Nov 2024 00:07:31 +0530 Subject: [PATCH 092/126] Issue #PS-0000 fix: Updated menubar --- src/components/SideBar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 99970b7..32f24bd 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -35,7 +35,7 @@ const menuItems = [ ...(userRole === Role.CCTA ? [{ text: "Up for Review", key: "up-review", icon: }] : []), - { text: "Publish", key: "publish", icon: }, + { text: "Published", key: "publish", icon: }, { text: "All My Contents", key: "allContents", icon: }, ]; From a6db7c94d1b96e53c7c265444b5d0a856b01795d Mon Sep 17 00:00:00 2001 From: Vivek kasture Date: Fri, 22 Nov 2024 00:31:00 +0530 Subject: [PATCH 093/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 3dd6f02..d15fd2c 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -32,6 +32,8 @@ jobs: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml + - name: Show contents of manifest/configmap.yaml + run: cat manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 15065adf45d44cfe4f0fe3193a7909d0cd0b49fa Mon Sep 17 00:00:00 2001 From: Vivek kasture Date: Fri, 22 Nov 2024 00:39:21 +0530 Subject: [PATCH 094/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index d15fd2c..7bbb1b3 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -33,7 +33,7 @@ jobs: run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show contents of manifest/configmap.yaml - run: cat manifest/configmap.yaml + run: cat manifest/configmap.yaml | base64 - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 42bcb6b590e47d073b1d456a2abaaf5a4d71c010 Mon Sep 17 00:00:00 2001 From: Vivek kasture Date: Fri, 22 Nov 2024 00:50:46 +0530 Subject: [PATCH 095/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 7bbb1b3..9b1e0c2 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -30,10 +30,8 @@ jobs: - name: Copy .env file env: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} - run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml - #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - - name: Show contents of manifest/configmap.yaml - run: cat manifest/configmap.yaml | base64 + # run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml + run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 838b7ed8ce5e89f652a7363ca5cdab7709e078d6 Mon Sep 17 00:00:00 2001 From: Vivek kasture Date: Fri, 22 Nov 2024 00:54:47 +0530 Subject: [PATCH 096/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 9b1e0c2..e4cab24 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -31,7 +31,7 @@ jobs: env: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} # run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml - run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml + run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 4dfc68bc19881515603490053832d348deba37e0 Mon Sep 17 00:00:00 2001 From: Vivek kasture Date: Fri, 22 Nov 2024 00:58:13 +0530 Subject: [PATCH 097/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index e4cab24..319cc92 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -30,8 +30,8 @@ jobs: - name: Copy .env file env: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} - # run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml - run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml + run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml + # run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 36f77df765f98c228fdaa5bb92e402b919312bfe Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 11:49:57 +0530 Subject: [PATCH 098/126] Issue feat:Await 2 seconds for delete items --- src/components/DeleteConfirmation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 1e15b68..4493808 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -41,7 +41,7 @@ const DeleteConfirmation: React.FC = ({ try { await deleteContent(rowData?.identifier, rowData?.mimeType); console.log(`Deleted item with identifier - ${rowData?.identifier}`); - await delay(1000); + await delay(2000); // Update the fetchContentAPI state after the delay setFetchContentAPI(!fetchContentAPI); @@ -70,7 +70,7 @@ const DeleteConfirmation: React.FC = ({ > - Are you sure you want to delete this item? + Are you sure you want to delete this Resource? {/* Date: Fri, 22 Nov 2024 12:17:08 +0530 Subject: [PATCH 099/126] Issue feat:CCTA cant only see up for review and restrict publish and reject option for STA --- src/components/KaTableComponent.tsx | 6 +++--- src/components/SideBar.tsx | 5 ++++- src/pages/workspace/content/review/index.tsx | 7 ++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index c864324..a5f413e 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -76,9 +76,9 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE ) { router.push({ pathname: `/editor`, query: { identifier, mode } }); } - // else if (content?.mimeType === MIME_TYPE.COURSE_MIME_TYPE && tableTitle==='submitted') { - // router.push({ pathname: `/editor`, query: { identifier, mode } }); - // } + else if ( tableTitle==='submitted') { + router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); + } else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { const pathname = tableTitle === 'upForReview' ? `/workspace/content/review` : `/upload-editor`; router.push({ pathname, query: { identifier, mode } }); diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 32f24bd..6470697 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -31,7 +31,10 @@ const userRole = getLocalStoredUserRole(); const menuItems = [ { text: "Create", key: "create", icon: }, { text: "Draft", key: "draft", icon: }, - { text: "Submitted for Review", key: "submitted", icon: }, + ...(userRole !== Role.CCTA + ? [ { text: "Submitted for Review", key: "submitted", icon: }, + ] + : []), ...(userRole === Role.CCTA ? [{ text: "Up for Review", key: "up-review", icon: }] : []), diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index d886b69..136b4d4 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -30,7 +30,8 @@ import { } from "../../../../components/players/playerMetadata"; import $ from "jquery"; import { MIME_TYPE, CHANNEL_ID } from "@/utils/app.config"; -import { getLocalStoredUserName } from "@/services/LocalStorageService"; +import { getLocalStoredUserName , getLocalStoredUserRole} from "@/services/LocalStorageService"; +import { Role } from "@/utils/app.constant"; const userFullName = getLocalStoredUserName() || "Anonymous User"; const [firstName, lastName] = userFullName.split(" "); @@ -388,7 +389,7 @@ const ReviewContentSubmissions = () => { - { > Request Changes - + )} ) : ( No content details available From 69981fae94761a93f576ce24c8ccb937adace250 Mon Sep 17 00:00:00 2001 From: Abhilash Dubey <124042593+AbhilashKD@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:32:22 +0530 Subject: [PATCH 100/126] Update dev-deployment.yaml --- .github/workflows/dev-deployment.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/dev-deployment.yaml b/.github/workflows/dev-deployment.yaml index 319cc92..ec62ed6 100644 --- a/.github/workflows/dev-deployment.yaml +++ b/.github/workflows/dev-deployment.yaml @@ -32,6 +32,11 @@ jobs: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT_DEV }} run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml # run: echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml + - name: Copy .env file in the code + env: + DEV_ENV: ${{ secrets.DEV_ENV }} + run: rm -f .env && echo '${{ secrets.DEV_ENV }}' > .env + #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | echo "Fetching all branches to ensure complete history" From 53b8ff8bbc3acf1f0cd10a61961641e93dbf773a Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 12:48:46 +0530 Subject: [PATCH 101/126] Issue feat:For up for review content CCTA can't publlish his own content --- src/components/KaTableComponent.tsx | 3 +++ src/pages/workspace/content/review/index.tsx | 6 +++++- src/pages/workspace/content/up-review/index.tsx | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index a5f413e..d0dda5e 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -73,6 +73,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl } // Generic routing for cases other than 'draft' + if (content?.mimeType === MIME_TYPE.QUESTIONSET_MIME_TYPE ) { router.push({ pathname: `/editor`, query: { identifier, mode } }); } @@ -80,6 +81,8 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); } else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { + localStorage.setItem('contentCreatedBy', content?.createdBy); + console.log(content) const pathname = tableTitle === 'upForReview' ? `/workspace/content/review` : `/upload-editor`; router.push({ pathname, query: { identifier, mode } }); } else if (content?.mimeType && MIME_TYPE.COLLECTION_MIME_TYPE.includes(content?.mimeType)) { diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 136b4d4..139a514 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -94,6 +94,10 @@ const ReviewContentSubmissions = () => { }, [identifier]); const redirectToReviewPage = () => { + if(getLocalStoredUserRole() === Role.SCTA){ + router.push({ pathname: `/workspace/content/up-review` }); + + } router.push({ pathname: `/workspace/content/submitted` }); }; @@ -389,7 +393,7 @@ const ReviewContentSubmissions = () => { - {getLocalStoredUserRole() === Role.CCTA&&( { status: item.status, identifier: item.identifier, mimeType: item.mimeType, - mode: item.mode + mode: item.mode, + createdBy: item.createdBy + })); setData(filteredArray) console.log(filteredArray) From 85b12ee75170da4f02547fa5f1addd9287d1cfbe Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 13:03:01 +0530 Subject: [PATCH 102/126] Issue feat:update back logic for back from review page --- src/pages/workspace/content/review/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 139a514..59c33f6 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -94,10 +94,11 @@ const ReviewContentSubmissions = () => { }, [identifier]); const redirectToReviewPage = () => { - if(getLocalStoredUserRole() === Role.SCTA){ + if(getLocalStoredUserRole() === Role.CCTA){ router.push({ pathname: `/workspace/content/up-review` }); } + else router.push({ pathname: `/workspace/content/submitted` }); }; From 9134b4f491d9ea456dfb18c0b832969310f6ddc4 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 13:16:49 +0530 Subject: [PATCH 103/126] Issue feat:change route --- src/pages/workspace/content/review/index.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 59c33f6..1492cfb 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -127,6 +127,11 @@ const ReviewContentSubmissions = () => { console.log("Published successfully:", response); // Add toaster success message here setOpenConfirmationPopup(false); + if(getLocalStoredUserRole() === Role.CCTA){ + router.push({ pathname: `/workspace/content/up-review` }); + + } + else router.push({ pathname: `/workspace/content/submitted` }); } catch (error) { console.error("Error during publishing:", error); @@ -140,6 +145,11 @@ const ReviewContentSubmissions = () => { console.log("Comment submitted successfully:", response); // Add toaster success message here setOpenCommentPopup(false); + if(getLocalStoredUserRole() === Role.CCTA){ + router.push({ pathname: `/workspace/content/up-review` }); + + } + else router.push({ pathname: `/workspace/content/submitted` }); } catch (error) { console.error("Error submitting comment:", error); From f422c1d6173de0d4bd9c5206d72c7e9b3a858466 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 13:39:25 +0530 Subject: [PATCH 104/126] Issue feat:Add creator column in up for review page --- src/components/KaTableComponent.tsx | 8 ++++++++ src/pages/workspace/content/up-review/index.tsx | 10 +++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index d0dda5e..7b9fd63 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -178,6 +178,14 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl ) } } + else if(props.column.key === "create-by") + { + return ( + + {props.rowData.creator} + + ) + } else if (props.column.key === 'contentAction') { { return ( diff --git a/src/pages/workspace/content/up-review/index.tsx b/src/pages/workspace/content/up-review/index.tsx index d0a88d8..5ffae53 100644 --- a/src/pages/workspace/content/up-review/index.tsx +++ b/src/pages/workspace/content/up-review/index.tsx @@ -26,11 +26,13 @@ import KaTableComponent from "@/components/KaTableComponent"; import { timeAgo } from "@/utils/Helper"; import useSharedStore from "@/utils/useSharedState"; const columns = [ - { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "300px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, - { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, + { key: 'create-by', title: 'CREATED BY', dataType: DataType.String, width: "100px" }, + { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, ] @@ -71,7 +73,9 @@ const UpForReviewPage = () => { identifier: item.identifier, mimeType: item.mimeType, mode: item.mode, - createdBy: item.createdBy + createdBy: item.createdBy, + creator: item.creator + })); setData(filteredArray) From 27647a64c63e5cd4815b9fc863b5159c3e4e32f1 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Fri, 22 Nov 2024 14:34:44 +0530 Subject: [PATCH 105/126] Issue feat:CCTA have access to review his own content --- src/pages/workspace/content/review/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 1492cfb..25b501b 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -404,7 +404,7 @@ const ReviewContentSubmissions = () => { - {getLocalStoredUserRole() === Role.CCTA&& localStorage.getItem("contentCreatedBy") !== localStorage.getItem("userId") &&( Date: Sat, 23 Nov 2024 12:20:23 +0530 Subject: [PATCH 106/126] workspace searchbar and select responsive till mobile --- src/components/GenericEditor.tsx | 34 ++++++++++++++++++++++++++++++-- src/components/SearchBox.tsx | 16 +++++++-------- src/components/SideBar.tsx | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 67edec2..68d358c 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -31,6 +31,10 @@ const GenericEditor: React.FC = () => { } console.log('editorConfig ==>', editorConfig); + + // Load CSS dynamically + loadPdfPlayerCss(); + getContentDetails(identifier) .then((data: any) => { initEditor(); @@ -59,6 +63,7 @@ const GenericEditor: React.FC = () => { // Cleanup function return () => { window.removeEventListener('popstate', popstateListener); + removePdfPlayerCss(); }; } }, [identifier]); @@ -83,6 +88,25 @@ const GenericEditor: React.FC = () => { } }; + // Dynamically load the CSS + const loadPdfPlayerCss = () => { + if (!document.getElementById("generic-editor.css")) { + const link = document.createElement("link"); + link.id = "generic-editor.css"; + link.rel = "stylesheet"; + link.href = "/path/to/generic-editor.css"; // Update with the correct path + document.head.appendChild(link); + } + }; + + // Remove the dynamically loaded CSS + const removePdfPlayerCss = () => { + const pdfPlayerCss = document.getElementById("generic-editor.css"); + if (pdfPlayerCss) { + document.head.removeChild(pdfPlayerCss); + } + }; + // Initialize the modal and open iframe const initEditor = () => { if (typeof window !== 'undefined') { @@ -151,13 +175,20 @@ const GenericEditor: React.FC = () => { } }; - // Function to close the modal and navigate away + // Function to close the modal and clean up const closeModal = () => { setShowLoader(false); + + // Remove the modal element const editorElement = document.getElementById('genericEditor'); if (editorElement) { editorElement.remove(); } + + // Remove specific CSS + removePdfPlayerCss(); + + // Navigate back window.history.back(); }; @@ -167,7 +198,6 @@ const GenericEditor: React.FC = () => { {showLoader &&
Loading.....
}
); - }; export default GenericEditor; diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index bb6b790..da90b17 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -102,7 +102,7 @@ const SearchBox: React.FC = ({ return ( - + = ({ sx={{ display: "flex", alignItems: "center", - borderRadius: "50px", - background: theme.palette.warning.A700, - boxShadow: "none", - border: "1px solid #000000DE !important", + backgroundColor: theme.palette.warning["A700"], + borderRadius: "8px", + "& .MuiOutlinedInput-root fieldset": { border: "none" }, + "& .MuiOutlinedInput-input": { borderRadius: 8 }, }} > = ({ - + Filter By = ({ selectedKey, onSelect }) => { > {item?.icon} - + ))} From 083156173edbd580e438677e7c352d4e52309d31 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Sat, 23 Nov 2024 12:21:04 +0530 Subject: [PATCH 107/126] workspace searchbar and select responsive till mobile --- src/components/GenericEditor.tsx | 36 +++----------------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 1cd079e..67edec2 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -31,10 +31,6 @@ const GenericEditor: React.FC = () => { } console.log('editorConfig ==>', editorConfig); - - // Load CSS dynamically - loadPdfPlayerCss(); - getContentDetails(identifier) .then((data: any) => { initEditor(); @@ -63,7 +59,6 @@ const GenericEditor: React.FC = () => { // Cleanup function return () => { window.removeEventListener('popstate', popstateListener); - removePdfPlayerCss(); }; } }, [identifier]); @@ -88,25 +83,6 @@ const GenericEditor: React.FC = () => { } }; - // Dynamically load the CSS - const loadPdfPlayerCss = () => { - if (!document.getElementById("generic-editor.css")) { - const link = document.createElement("link"); - link.id = "generic-editor.css"; - link.rel = "stylesheet"; - link.href = "/path/to/generic-editor.css"; // Update with the correct path - document.head.appendChild(link); - } - }; - - // Remove the dynamically loaded CSS - const removePdfPlayerCss = () => { - const pdfPlayerCss = document.getElementById("generic-editor.css"); - if (pdfPlayerCss) { - document.head.removeChild(pdfPlayerCss); - } - }; - // Initialize the modal and open iframe const initEditor = () => { if (typeof window !== 'undefined') { @@ -162,7 +138,7 @@ const GenericEditor: React.FC = () => { if (typeof window !== 'undefined') { window['config'] = _.cloneDeep(editorConfig.GENERIC_EDITOR.WINDOW_CONFIG); window['config'].build_number = buildNumber; - window['config'].headerLogo = '/logo.png'; + window['config'].headerLogo = 'https://staging.sunbirded.org/assets/images/sunbird_logo.png'; window['config'].lock = {}; window['config'].extContWhitelistedDomains = extContWhitelistedDomains; window['config'].enableTelemetryValidation = false; @@ -175,20 +151,13 @@ const GenericEditor: React.FC = () => { } }; - // Function to close the modal and clean up + // Function to close the modal and navigate away const closeModal = () => { setShowLoader(false); - - // Remove the modal element const editorElement = document.getElementById('genericEditor'); if (editorElement) { editorElement.remove(); } - - // Remove specific CSS - removePdfPlayerCss(); - - // Navigate back window.history.back(); }; @@ -198,6 +167,7 @@ const GenericEditor: React.FC = () => { {showLoader &&
Loading.....
} ); + }; export default GenericEditor; From 9b90199e4aa2607991a713f5b8cb70d3f13909a8 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Sat, 23 Nov 2024 12:23:15 +0530 Subject: [PATCH 108/126] workspace searchbar and select responsive till mobile --- src/components/GenericEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/GenericEditor.tsx b/src/components/GenericEditor.tsx index 67edec2..84e9869 100644 --- a/src/components/GenericEditor.tsx +++ b/src/components/GenericEditor.tsx @@ -138,7 +138,7 @@ const GenericEditor: React.FC = () => { if (typeof window !== 'undefined') { window['config'] = _.cloneDeep(editorConfig.GENERIC_EDITOR.WINDOW_CONFIG); window['config'].build_number = buildNumber; - window['config'].headerLogo = 'https://staging.sunbirded.org/assets/images/sunbird_logo.png'; + window['config'].headerLogo = '/logo.png'; window['config'].lock = {}; window['config'].extContWhitelistedDomains = extContWhitelistedDomains; window['config'].enableTelemetryValidation = false; From df6a9672634162cfd539d5ea7d0f1a7de1c5cf4f Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 14:38:11 +0530 Subject: [PATCH 109/126] Issue feat: Add discover content tab --- src/components/KaTableComponent.tsx | 6 + src/components/SideBar.tsx | 2 + .../content/discover-contents/index.tsx | 229 ++++++++++++++++++ 3 files changed, 237 insertions(+) create mode 100644 src/pages/workspace/content/discover-contents/index.tsx diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 7b9fd63..fdd6172 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -57,6 +57,9 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl case 'publish': mode = "read"; break; + case 'discover-contents': + mode = "read"; + break; case 'submitted': mode = "read"; break; @@ -66,6 +69,9 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl case 'all-content': mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" break; + case 'contents': + mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" + break; // Default case for "all-content" or any other values if mode is already defined in content default: mode = mode ||"read" ; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 6470697..1e0007c 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -40,6 +40,8 @@ const menuItems = [ : []), { text: "Published", key: "publish", icon: }, { text: "All My Contents", key: "allContents", icon: }, + { text: "Discover-contents", key: "discover-contents", icon: }, + ]; interface SidebarProps { diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx new file mode 100644 index 0000000..ef4c06d --- /dev/null +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -0,0 +1,229 @@ +import React, { useEffect, useMemo, useState, useCallback } from "react"; +import Layout from "../../../../components/Layout"; +import { + Typography, + Box, + Table, + TableHead, + TableBody, + TableRow, + TableCell, + TablePagination, + IconButton, + useTheme, +} from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; +import UpReviewTinyImage from "@mui/icons-material/LibraryBooks"; +import SearchBox from "../../../../components/SearchBox"; +import { deleteContent, getContent } from "../../../../services/ContentService"; +import { timeAgo } from "@/utils/Helper"; +import Loader from "@/components/Loader"; +import NoDataFound from "@/components/NoDataFound"; +import { MIME_TYPE } from "@/utils/app.config"; +import router from "next/router"; +import PaginationComponent from "@/components/PaginationComponent"; +import { LIMIT } from "@/utils/app.constant"; +import WorkspaceText from "@/components/WorkspaceText"; +import { Table as KaTable } from 'ka-table'; +import { DataType } from 'ka-table/enums'; +import "ka-table/style.css"; +import KaTableComponent from "@/components/KaTableComponent"; +import useSharedStore from "@/utils/useSharedState"; +// const columns = [ +// { key: 'name', title: 'Content', dataType: DataType.String, width: "450px" }, +// { key: 'lastUpdatedOn', title: 'Last Updated', dataType: DataType.String, width: "300px" }, +// { key: 'status', title: 'Status', dataType: DataType.String, width: "300px" }, +// { key: 'contentAction', title: 'Action', dataType: DataType.String, width: "200px" }, + +// ] +const columns = [ + { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, + { key: 'contentAction', title: 'ACTION', dataType: DataType.String, width: "100px" }, + { key: 'create-by', title: 'CREATED BY', dataType: DataType.String, width: "100px" }, + + +] +const ContentsPage = () => { + const theme = useTheme(); + + const [selectedKey, setSelectedKey] = useState("contents"); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + const [searchTerm, setSearchTerm] = useState(""); + const [filter, setFilter] = useState([]); + const [sortBy, setSortBy] = useState("Modified On"); + const [contentList, setContentList] = React.useState([]); + const [data, setData] = React.useState([]); + + const [loading, setLoading] = useState(false); + const [contentDeleted, setContentDeleted] = React.useState(false); + const fetchContentAPI = useSharedStore( + (state: any) => state.fetchContentAPI + ); + const [debouncedSearchTerm, setDebouncedSearchTerm] = + useState(searchTerm); + const [totalCount, setTotalCount] = useState(0); + + const handleChangePage = (event: unknown, newPage: number) => { + setPage(newPage - 1); + }; + + const handleChangeRowsPerPage = ( + event: React.ChangeEvent + ) => { + setRowsPerPage(parseInt(event.target.value, 10)); + setPage(0); + }; + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedSearchTerm(searchTerm); + }, 300); + + return () => { + clearTimeout(handler); + }; + }, [searchTerm]); + + const handleSearch = (term: string) => { + setSearchTerm(term); + }; + + const handleFilterChange = (filter: string[]) => { + setFilter(filter); + }; + + const handleSortChange = (sortBy: string) => { + console.log("sortBy", sortBy) + setSortBy(sortBy); + }; + + + useEffect(() => { + const getContentList = async () => { + try { + setLoading(true); + const status = [ + // "Draft", + // "FlagDraft", + // "Review", + // "Processing", + "Live", + // "Unlisted", + // "FlagReview", + ]; + const query = debouncedSearchTerm || ""; + const primaryCategory = filter.length ? filter : []; + const order = sortBy === "Created On" ? "asc" : "desc"; + const sort_by = { + lastUpdatedOn: order, + }; + const offset = page * LIMIT; + const contentType="upReview" + + const response = await getContent( + status, + query, + LIMIT, + offset, + primaryCategory, + sort_by, + contentType + ); + const contentList = (response?.content || []).concat( + response?.QuestionSet || [] + ); + setContentList(contentList); + setTotalCount(response?.count); + setLoading(false); + } catch (error) { + console.log(error); + } + }; + getContentList(); + }, [debouncedSearchTerm, filter,fetchContentAPI, sortBy, page]); + + useEffect(() => { + const filteredArray = contentList.map(item => ({ + image: item?.appIcon, + contentType: item.primaryCategory, + name: item.name, + primaryCategory: item.primaryCategory, + lastUpdatedOn: timeAgo(item.lastUpdatedOn), + status: item.status, + identifier: item.identifier, + mimeType: item.mimeType, + mode: item.mode, + creator: item.creator + + + })); + setData(filteredArray) + console.log(filteredArray) + }, [contentList]); + + + + const filteredData = useMemo( + () => + contentList?.filter((content) => + content?.name.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) + ), + [debouncedSearchTerm, contentList] + ); + + + const displayedRows = filteredData.slice( + page * rowsPerPage, + page * rowsPerPage + rowsPerPage + ); + + console.log("contentList", contentList) + return ( + + + + + LIMIT ? '15px' : '0px' }}> + + All My Contents + + {/* Here you see all your content. */} + + + + + {loading ? ( + + ) : ( + <> + + + + + )} + {totalCount > LIMIT && ( + setPage(newPage - 1)} + /> + )} + + + + + + + ); +}; + +export default ContentsPage; From d851b751232b24a00e50b6ff72ee9dada4297dcf Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 14:38:18 +0530 Subject: [PATCH 110/126] update pr --- next.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/next.config.js b/next.config.js index 362f84a..6d03bcb 100644 --- a/next.config.js +++ b/next.config.js @@ -131,6 +131,8 @@ const nextConfig = { "./SunbirdPlayers": "/src/pages/sunbirdPlayers.tsx", "./Review": "/src/pages/workspace/content/review/index.tsx", "./UpReview": "/src/pages/workspace/content/up-review/index.tsx", + "./DiscoverContent": "/src/pages/workspace/content/discover-contents/index.tsx", + }, }) From f806d9422f361cc0d5544e901315e6b25f89be61 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 14:44:53 +0530 Subject: [PATCH 111/126] Issue feat: Remove unwanted code --- src/components/KaTableComponent.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index fdd6172..216b0d0 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -69,9 +69,6 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl case 'all-content': mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" break; - case 'contents': - mode=content?.status==="Draft"|| content?.status==="Live" ?"edit":"review" - break; // Default case for "all-content" or any other values if mode is already defined in content default: mode = mode ||"read" ; From ed246d49bb5934cd90007cddd7d0bd1cec302617 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 15:12:25 +0530 Subject: [PATCH 112/126] Issue feat:Add missing key in content interface --- src/utils/interfaces.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/interfaces.ts b/src/utils/interfaces.ts index 35f96dd..fa338fd 100644 --- a/src/utils/interfaces.ts +++ b/src/utils/interfaces.ts @@ -8,6 +8,7 @@ interface DashboardContentProps { } interface content { + creator?: any; name: string; status: string; lastUpdatedOn: string; From 826c3cf3d11ebee4796a2674cecf40eb0a1b697a Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Mon, 25 Nov 2024 17:09:07 +0530 Subject: [PATCH 113/126] Workspace UI improvement --- src/components/Layout.tsx | 2 +- src/components/SideBar.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 9324838..0844930 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -14,7 +14,7 @@ const Layout: React.FC = ({ children, selectedKey, onSelect }) => { - {children} + {children}
) }; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 5c45aef..dcf91f7 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -30,16 +30,16 @@ const userRole = getLocalStoredUserRole(); // Updated menu items with icons const menuItems = [ { text: "Create", key: "create", icon: }, - { text: "Draft", key: "draft", icon: }, + { text: "Drafts", key: "draft", icon: }, ...(userRole !== Role.CCTA - ? [ { text: "Submitted for Review", key: "submitted", icon: }, + ? [{ text: "Submitted for Review", key: "submitted", icon: }, ] : []), ...(userRole === Role.CCTA ? [{ text: "Up for Review", key: "up-review", icon: }] : []), { text: "Published", key: "publish", icon: }, - { text: "All My Contents", key: "allContents", icon: }, + { text: "All My Content", key: "allContents", icon: }, ]; interface SidebarProps { @@ -164,7 +164,7 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { > {item?.icon} - + ))} From acdfeaa861aa7f4141657ab3e365dbe6943b79f7 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 19:10:49 +0530 Subject: [PATCH 114/126] Issue feat:open discover content in read mode without r and reject button and add created by filter for search API on discover content page --- src/components/KaTableComponent.tsx | 3 +++ .../content/discover-contents/index.tsx | 2 +- src/pages/workspace/content/review/index.tsx | 11 ++++++--- src/services/ContentService.ts | 24 ++++++++++++++++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 216b0d0..cd5eba3 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -82,6 +82,9 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl } else if ( tableTitle==='submitted') { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); + } + else if ( tableTitle==='discover-contents') { + router.push({ pathname: `/workspace/content/review`, query: { identifier, mode, isDiscoverContent: true } }); } else if (content?.mimeType && MIME_TYPE.GENERIC_MIME_TYPE.includes(content?.mimeType)) { localStorage.setItem('contentCreatedBy', content?.createdBy); diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx index ef4c06d..9b4b2c5 100644 --- a/src/pages/workspace/content/discover-contents/index.tsx +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -122,7 +122,7 @@ const ContentsPage = () => { lastUpdatedOn: order, }; const offset = page * LIMIT; - const contentType="upReview" + const contentType="discover-contents" const response = await getContent( status, diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 25b501b..2add471 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -41,7 +41,8 @@ const ReviewContentSubmissions = () => { useState(false); const router = useRouter(); const { identifier } = router.query; - + const { isDiscoverContent } = router.query; +console.log("isDiscoverContent", isDiscoverContent); const [contentDetails, setContentDetails] = useState(undefined); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); const [confirmationActionType, setConfirmationActionType] = useState< @@ -94,7 +95,11 @@ const ReviewContentSubmissions = () => { }, [identifier]); const redirectToReviewPage = () => { - if(getLocalStoredUserRole() === Role.CCTA){ + if(isDiscoverContent === "true"){ + router.push({ pathname: `/workspace/content/discover-contents` }); + + } + else if(getLocalStoredUserRole() === Role.CCTA){ router.push({ pathname: `/workspace/content/up-review` }); } @@ -404,7 +409,7 @@ const ReviewContentSubmissions = () => {
- {getLocalStoredUserRole() === Role.CCTA &&( Date: Mon, 25 Nov 2024 19:14:25 +0530 Subject: [PATCH 115/126] remove console.log --- src/pages/workspace/content/review/index.tsx | 1 - src/services/ContentService.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index 2add471..d3cb651 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -42,7 +42,6 @@ const ReviewContentSubmissions = () => { const router = useRouter(); const { identifier } = router.query; const { isDiscoverContent } = router.query; -console.log("isDiscoverContent", isDiscoverContent); const [contentDetails, setContentDetails] = useState(undefined); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); const [confirmationActionType, setConfirmationActionType] = useState< diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index f2b361c..9ecd2a0 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -69,7 +69,6 @@ const getReqBodyWithStatus = ( primaryCategory.length === 0 ? PrimaryCategory : primaryCategory; if(contentType==="discover-contents") { - console.log("hiii") return { ...upForReviewReqBody, request: { From 8745b61ea815600250d54a937d89009f8498fab4 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 23:35:35 +0530 Subject: [PATCH 116/126] Issue feat:Add filter by status on all my content and UI enahncement --- src/components/KaTableComponent.tsx | 8 ++++ src/components/SearchBox.tsx | 31 ++++++++++++++- src/components/SideBar.tsx | 6 +-- .../workspace/content/allContents/index.tsx | 38 ++++++++++++++++++- .../content/discover-contents/index.tsx | 12 +++--- src/utils/app.constant.ts | 2 + 6 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index cd5eba3..a2bfc42 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -186,11 +186,19 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl } else if(props.column.key === "create-by") { + if(props.rowData.creator) return ( {props.rowData.creator} ) + else + return ( + + - + + ) + } else if (props.column.key === 'contentAction') { { diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index bb6b790..d1d1125 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -19,7 +19,7 @@ import SearchIcon from "@mui/icons-material/Search"; import ClearIcon from "@mui/icons-material/Clear"; import { debounce } from "@/utils/Helper"; import { getPrimaryCategory } from "@/services/ContentService"; -import { SortOptions } from "@/utils/app.constant"; +import { SortOptions , StatusOptions} from "@/utils/app.constant"; export interface SearchBarProps { onSearch: (value: string) => void; @@ -28,6 +28,8 @@ export interface SearchBarProps { placeholder: string; onFilterChange?: (selectedFilters: string[]) => void; onSortChange?: (sortBy: string) => void; + onStatusChange?: (status: string) => void; + allContents?: boolean } const sortOptions = SortOptions; @@ -38,11 +40,15 @@ const SearchBox: React.FC = ({ placeholder = "Search...", onFilterChange, onSortChange, + onStatusChange, + allContents=false }) => { const theme = useTheme(); const [searchTerm, setSearchTerm] = useState(value); const [selectedFilters, setSelectedFilters] = useState([]); const [sortBy, setSortBy] = useState("Modified On"); + const [status, setStatus] = useState(""); + const [primaryCategory, setPrimaryCategory] = useState(); useEffect(() => { @@ -100,6 +106,11 @@ const SearchBox: React.FC = ({ onSortChange && onSortChange(value); }; + const handleStatusChange = (event: SelectChangeEvent) => { + const value = event.target.value as string; + setStatus(value); + onStatusChange && onStatusChange(value); + }; return ( @@ -194,7 +205,7 @@ const SearchBox: React.FC = ({ - + Sort By @@ -211,6 +222,22 @@ const SearchBox: React.FC = ({ + {allContents &&( + + Filter By Status + + + )} ); }; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 1e0007c..fdd47d9 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -21,7 +21,7 @@ import { import Image from "next/image"; import { useRouter } from "next/router"; import React, { useState } from "react"; - +import ManageSearchIcon from '@mui/icons-material/ManageSearch'; import logo from "/public/logo.png"; import { Role } from "@/utils/app.constant"; import { getLocalStoredUserRole } from "@/services/LocalStorageService"; @@ -38,9 +38,9 @@ const menuItems = [ ...(userRole === Role.CCTA ? [{ text: "Up for Review", key: "up-review", icon: }] : []), - { text: "Published", key: "publish", icon: }, + { text: "My Published Contents", key: "publish", icon: }, { text: "All My Contents", key: "allContents", icon: }, - { text: "Discover-contents", key: "discover-contents", icon: }, + { text: "Discover-contents", key: "discover-contents", icon: }, ]; diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index 523574b..bc705bf 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -54,6 +54,8 @@ const AllContentsPage = () => { const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("Modified On"); + const [statusBy, setStatusBy] = useState(""); + const [contentList, setContentList] = React.useState([]); const [data, setData] = React.useState([]); @@ -99,13 +101,16 @@ const AllContentsPage = () => { console.log("sortBy", sortBy) setSortBy(sortBy); }; + const handleStatusChange = (statusBy: string) => { + setStatusBy(statusBy); + }; useEffect(() => { const getContentList = async () => { try { setLoading(true); - const status = [ + let status=[ "Draft", "FlagDraft", "Review", @@ -114,6 +119,33 @@ const AllContentsPage = () => { "Unlisted", "FlagReview", ]; + if (statusBy === "" || statusBy === "All") { + status = [ + "Draft", + "FlagDraft", + "Review", + "Processing", + "Live", + "Unlisted", + "FlagReview", + ]; + } + else if (statusBy === "Live") { + status = ["Live"]; + } + else if (statusBy === "Review") { + status = ["Review"]; + } + else if (statusBy === "Draft") { + status = ["Draft"]; + } + else if (statusBy === "Unlisted") { + status = ["Unlisted"]; + } + else if (statusBy === "FlagReview") { + status = ["FlagReview"]; + } + const query = debouncedSearchTerm || ""; const primaryCategory = filter.length ? filter : []; const order = sortBy === "Created On" ? "asc" : "desc"; @@ -140,7 +172,7 @@ const AllContentsPage = () => { } }; getContentList(); - }, [debouncedSearchTerm, filter,fetchContentAPI, sortBy, page]); + }, [debouncedSearchTerm, filter,fetchContentAPI, sortBy, statusBy, page]); useEffect(() => { const filteredArray = contentList.map(item => ({ @@ -193,6 +225,8 @@ const AllContentsPage = () => { onSearch={handleSearch} onFilterChange={handleFilterChange} onSortChange={handleSortChange} + onStatusChange={handleStatusChange} + allContents={true} /> {loading ? ( diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx index 9b4b2c5..f47cb7f 100644 --- a/src/pages/workspace/content/discover-contents/index.tsx +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -37,19 +37,19 @@ import useSharedStore from "@/utils/useSharedState"; // ] const columns = [ - { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, - { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, - { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, - { key: 'contentAction', title: 'ACTION', dataType: DataType.String, width: "100px" }, + { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "200px" }, { key: 'create-by', title: 'CREATED BY', dataType: DataType.String, width: "100px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "100px" }, + { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, + { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "100px" }, + ] const ContentsPage = () => { const theme = useTheme(); - const [selectedKey, setSelectedKey] = useState("contents"); + const [selectedKey, setSelectedKey] = useState("discover-contents"); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const [searchTerm, setSearchTerm] = useState(""); diff --git a/src/utils/app.constant.ts b/src/utils/app.constant.ts index 5824641..9dae7d7 100644 --- a/src/utils/app.constant.ts +++ b/src/utils/app.constant.ts @@ -12,6 +12,8 @@ export enum Role { CCTA="Central Admin CCTA" } export const SortOptions = ["Modified On", "Created On"]; +export const StatusOptions = ["Live", "Review" , "Draft", "All"]; + export const LIMIT = 10; From 02cb7dfc4c52a49c78d0fd917a3b99ed6ae146db Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Mon, 25 Nov 2024 23:44:53 +0530 Subject: [PATCH 117/126] update pr --- src/components/SearchBox.tsx | 2 +- src/components/SideBar.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index 70bf5f6..d5b5d27 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -206,7 +206,7 @@ const SearchBox: React.FC = ({ - + Sort By Date: Tue, 26 Nov 2024 16:00:21 +0530 Subject: [PATCH 123/126] Issue feat:Resolve bugs --- src/components/KaTableComponent.tsx | 7 ++++++- src/components/SearchBox.tsx | 2 +- src/pages/workspace/content/allContents/index.tsx | 7 ++++--- src/pages/workspace/content/discover-contents/index.tsx | 5 +++-- src/pages/workspace/content/review/index.tsx | 7 ++++++- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index a2bfc42..371ee3c 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -83,6 +83,11 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl else if ( tableTitle==='submitted') { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); } + else if ( tableTitle==='all-content') { + if(mode==="review"){ + router.push({ pathname: `/workspace/content/review`, query: { identifier, mode, isReadOnly: true } }); + } + } else if ( tableTitle==='discover-contents') { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode, isDiscoverContent: true } }); } @@ -153,7 +158,7 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl {props.rowData.name}
- + {props.column.key === 'name' ? props.rowData.primaryCategory : props.rowData.description}
diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index ee26a4b..e9b9452 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -47,7 +47,7 @@ const SearchBox: React.FC = ({ const [searchTerm, setSearchTerm] = useState(value); const [selectedFilters, setSelectedFilters] = useState([]); const [sortBy, setSortBy] = useState("Modified On"); - const [status, setStatus] = useState(""); + const [status, setStatus] = useState("All"); const [primaryCategory, setPrimaryCategory] = useState(); diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index bc705bf..f83143b 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -37,7 +37,7 @@ import useSharedStore from "@/utils/useSharedState"; // ] const columns = [ - { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, @@ -54,7 +54,7 @@ const AllContentsPage = () => { const [searchTerm, setSearchTerm] = useState(""); const [filter, setFilter] = useState([]); const [sortBy, setSortBy] = useState("Modified On"); - const [statusBy, setStatusBy] = useState(""); + const [statusBy, setStatusBy] = useState("All"); const [contentList, setContentList] = React.useState([]); const [data, setData] = React.useState([]); @@ -184,7 +184,8 @@ const AllContentsPage = () => { status: item.status, identifier: item.identifier, mimeType: item.mimeType, - mode: item.mode + mode: item.mode, + description: item?.description })); setData(filteredArray) diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx index f47cb7f..93b7c10 100644 --- a/src/pages/workspace/content/discover-contents/index.tsx +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -37,7 +37,7 @@ import useSharedStore from "@/utils/useSharedState"; // ] const columns = [ - { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "200px" }, + { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "200px" }, { key: 'create-by', title: 'CREATED BY', dataType: DataType.String, width: "100px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "100px" }, @@ -157,7 +157,8 @@ const ContentsPage = () => { identifier: item.identifier, mimeType: item.mimeType, mode: item.mode, - creator: item.creator + creator: item.creator, + description: item?.description })); diff --git a/src/pages/workspace/content/review/index.tsx b/src/pages/workspace/content/review/index.tsx index d3cb651..abc7f37 100644 --- a/src/pages/workspace/content/review/index.tsx +++ b/src/pages/workspace/content/review/index.tsx @@ -42,6 +42,9 @@ const ReviewContentSubmissions = () => { const router = useRouter(); const { identifier } = router.query; const { isDiscoverContent } = router.query; + const { isReadOnly } = router.query; + const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); + const [contentDetails, setContentDetails] = useState(undefined); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); const [confirmationActionType, setConfirmationActionType] = useState< @@ -131,6 +134,8 @@ const ReviewContentSubmissions = () => { console.log("Published successfully:", response); // Add toaster success message here setOpenConfirmationPopup(false); + await delay(2000); + if(getLocalStoredUserRole() === Role.CCTA){ router.push({ pathname: `/workspace/content/up-review` }); @@ -408,7 +413,7 @@ const ReviewContentSubmissions = () => {
- {getLocalStoredUserRole() === Role.CCTA && isDiscoverContent !== "true" &&( Date: Tue, 26 Nov 2024 17:15:38 +0530 Subject: [PATCH 124/126] Issue feat:SCTA user can only see assigned state contents at discover content page --- src/services/ContentService.ts | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/services/ContentService.ts b/src/services/ContentService.ts index 9ecd2a0..eb79b8c 100644 --- a/src/services/ContentService.ts +++ b/src/services/ContentService.ts @@ -1,9 +1,9 @@ -import { getLocalStoredUserId } from "./LocalStorageService"; +import { getLocalStoredUserId , getLocalStoredUserRole} from "./LocalStorageService"; import { delApi, get, post } from "./RestClient"; import axios from "axios"; import { MIME_TYPE, CHANNEL_ID, TENANT_ID } from "@/utils/app.config"; import { v4 as uuidv4 } from "uuid"; -import { PrimaryCategoryValue } from "@/utils/app.constant"; +import { PrimaryCategoryValue, Role } from "@/utils/app.constant"; const userId = getLocalStoredUserId(); console.log("userId ==>", userId); @@ -69,6 +69,31 @@ const getReqBodyWithStatus = ( primaryCategory.length === 0 ? PrimaryCategory : primaryCategory; if(contentType==="discover-contents") { + const userRole = getLocalStoredUserRole(); + + if(userRole===Role.SCTA && localStorage.getItem("stateName")) + { + return { + ...upForReviewReqBody, + request: { + ...upForReviewReqBody.request, + filters: { + ...upForReviewReqBody.request.filters, + status, + primaryCategory, + createdBy:{"!=":localStorage.getItem("userId")}, + state:localStorage.getItem("stateName"), + + }, + + query, + limit, + offset, + sort_by, + }, + }; + } + return { ...upForReviewReqBody, request: { From 8b5a000d7e9cc2400463d29351db61dc33d2c435 Mon Sep 17 00:00:00 2001 From: ttpl-rt-217 Date: Tue, 26 Nov 2024 17:27:31 +0530 Subject: [PATCH 125/126] workspaace ui improverment --- src/components/DeleteConfirmation.tsx | 9 +- src/components/KaTableComponent.tsx | 134 +++++----- src/components/Layout.tsx | 2 +- src/components/SearchBox.tsx | 237 +++++++++--------- src/components/SideBar.tsx | 6 +- .../workspace/content/allContents/index.tsx | 2 +- .../content/discover-contents/index.tsx | 2 +- src/pages/workspace/content/draft/index.tsx | 2 +- src/pages/workspace/content/publish/index.tsx | 2 +- .../workspace/content/submitted/index.tsx | 2 +- 10 files changed, 206 insertions(+), 192 deletions(-) diff --git a/src/components/DeleteConfirmation.tsx b/src/components/DeleteConfirmation.tsx index 4493808..aaa050c 100644 --- a/src/components/DeleteConfirmation.tsx +++ b/src/components/DeleteConfirmation.tsx @@ -91,7 +91,14 @@ const DeleteConfirmation: React.FC = ({ No, go back - diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index bb6ef2a..025aea1 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { Table as KaTable } from 'ka-table'; import { DataType, EditingMode, SortingMode } from 'ka-table/enums'; -import { Typography, useTheme, IconButton, Box } from '@mui/material'; +import { Typography, useTheme, IconButton, Box, Grid } from '@mui/material'; import UpReviewTinyImage from '@mui/icons-material/LibraryBooks'; import "ka-table/style.css"; import DeleteIcon from "@mui/icons-material/Delete"; @@ -110,70 +110,72 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl if (props.column.key === 'name' || props.column.key === "title_and_description") { return (
openEditor(props.rowData)} > - {props.rowData.image ? ( - - Image - - ) : props.column.key === 'name' ? ( - - Image + + {props.rowData.image ? ( + + Image + + ) : props.column.key === 'name' ? ( + + Image - - ) : ( + /> + + ) : ( - Image = ({ data, columns, tableTitl borderRadius: "8px", }} - /> + /> - )} -
-
- {props.rowData.name} -
-
- - {props.column.key === 'name' ? props.rowData.primaryCategory : props.rowData.description} - -
-
+ )} + + +
+
+ {props.rowData.name} +
+
+ + {props.column.key === 'name' ? props.rowData.primaryCategory : props.rowData.description} + +
+
+
+ + +
); } diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 0844930..913ac02 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -11,7 +11,7 @@ interface LayoutProps { const Layout: React.FC = ({ children, selectedKey, onSelect }) => { return ( - + {children} diff --git a/src/components/SearchBox.tsx b/src/components/SearchBox.tsx index d3c4dd0..8768efe 100644 --- a/src/components/SearchBox.tsx +++ b/src/components/SearchBox.tsx @@ -118,133 +118,132 @@ const SearchBox: React.FC = ({ onStatusChange && onStatusChange(value); }; return ( - - - - e.preventDefault()} - sx={{ - display: "flex", - alignItems: "center", - backgroundColor: theme.palette.warning["A700"], - borderRadius: "8px", - "& .MuiOutlinedInput-root fieldset": { border: "none" }, - "& .MuiOutlinedInput-input": { borderRadius: 8 }, - }} - > - - + + + + e.preventDefault()} + sx={{ + display: "flex", + alignItems: "center", + backgroundColor: theme.palette.warning["A700"], + borderRadius: "8px", + "& .MuiOutlinedInput-root fieldset": { border: "none" }, + "& .MuiOutlinedInput-input": { borderRadius: 8 }, + }} > - {searchTerm ? : } - - - - - - - - Filter By - } + renderValue={(selected) => (selected as string[]).join(", ")} + sx={{ + "& .MuiOutlinedInput-root": { + "&.Mui-focused fieldset": { borderColor: "#000" }, + }, + "& .MuiSelect-select": { + height: "20px", + display: "flex", + alignItems: "center", + }, + }} + > + {filterOptions?.map((option) => ( + -1} - /> - - - - ))} - - - - - - - - Sort By - - + > + -1} + sx={{ + color: "#000", + "&.Mui-checked, &.MuiCheckbox-indeterminate": { color: "#000" }, + }} + /> + + + ))} + + + + + + + Sort By + + + + + {allContents && ( + + + Filter By Status + + + + )} - {allContents &&( - - Filter By Status - - - )} - + + ); }; diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 4ed7244..96c6cf0 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -85,7 +85,7 @@ const Sidebar: React.FC = ({ selectedKey, onSelect }) => { = ({ selectedKey, onSelect }) => { = ({ selectedKey, onSelect }) => { sx={{ display: "flex", justifyContent: "flex-start", - width: 275, + width: 284, }} > diff --git a/src/pages/workspace/content/allContents/index.tsx b/src/pages/workspace/content/allContents/index.tsx index bc705bf..3193a04 100644 --- a/src/pages/workspace/content/allContents/index.tsx +++ b/src/pages/workspace/content/allContents/index.tsx @@ -38,7 +38,7 @@ import useSharedStore from "@/utils/useSharedState"; // ] const columns = [ { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "200px" }, { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'contentAction', title: 'ACTION', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx index f47cb7f..685cb25 100644 --- a/src/pages/workspace/content/discover-contents/index.tsx +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -37,7 +37,7 @@ import useSharedStore from "@/utils/useSharedState"; // ] const columns = [ - { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "200px" }, + { key: 'name', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "350px" }, { key: 'create-by', title: 'CREATED BY', dataType: DataType.String, width: "100px" }, { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/draft/index.tsx b/src/pages/workspace/content/draft/index.tsx index b54c604..ce07968 100644 --- a/src/pages/workspace/content/draft/index.tsx +++ b/src/pages/workspace/content/draft/index.tsx @@ -29,7 +29,7 @@ import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "200px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/publish/index.tsx b/src/pages/workspace/content/publish/index.tsx index 8cb0d15..265bbad 100644 --- a/src/pages/workspace/content/publish/index.tsx +++ b/src/pages/workspace/content/publish/index.tsx @@ -28,7 +28,7 @@ import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "200px" }, // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, diff --git a/src/pages/workspace/content/submitted/index.tsx b/src/pages/workspace/content/submitted/index.tsx index 8379a99..a06a5da 100644 --- a/src/pages/workspace/content/submitted/index.tsx +++ b/src/pages/workspace/content/submitted/index.tsx @@ -27,7 +27,7 @@ import { timeAgo } from "@/utils/Helper"; import useSharedStore from "@/utils/useSharedState"; const columns = [ { key: 'title_and_description', title: 'TITLE & DESCRIPTION', dataType: DataType.String, width: "450px" }, - { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "250px" }, + { key: 'contentType', title: 'CONTENT TYPE', dataType: DataType.String, width: "200px" }, // { key: 'status', title: 'STATUS', dataType: DataType.String, width: "100px" }, { key: 'lastUpdatedOn', title: 'LAST MODIFIED', dataType: DataType.String, width: "180px" }, { key: 'action', title: 'ACTION', dataType: DataType.String, width: "100px" }, From c698a636c03f148abf24155d76a421a71bbcb0a7 Mon Sep 17 00:00:00 2001 From: Akshata Katwal Date: Wed, 27 Nov 2024 13:09:34 +0530 Subject: [PATCH 126/126] Issue feat:Resolve all content open issue --- src/components/KaTableComponent.tsx | 4 +--- src/components/SideBar.tsx | 2 +- src/pages/workspace/content/discover-contents/index.tsx | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/KaTableComponent.tsx b/src/components/KaTableComponent.tsx index 3bb4107..eb5146a 100644 --- a/src/components/KaTableComponent.tsx +++ b/src/components/KaTableComponent.tsx @@ -84,10 +84,8 @@ const KaTableComponent: React.FC = ({ data, columns, tableTitl else if ( tableTitle==='submitted') { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode } }); } - else if ( tableTitle==='all-content') { - if(mode==="review"){ + else if ( tableTitle==='all-content' && mode==="review") { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode, isReadOnly: true } }); - } } else if ( tableTitle==='discover-contents') { router.push({ pathname: `/workspace/content/review`, query: { identifier, mode, isDiscoverContent: true } }); diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 4ed7244..5c7a6e6 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -40,7 +40,7 @@ const menuItems = [ : []), { text: "My Published Contents", key: "publish", icon: }, { text: "All My Contents", key: "allContents", icon: }, - { text: "Discover-contents", key: "discover-contents", icon: }, + { text: "Discover Contents", key: "discover-contents", icon: }, ]; diff --git a/src/pages/workspace/content/discover-contents/index.tsx b/src/pages/workspace/content/discover-contents/index.tsx index 93b7c10..e01d56c 100644 --- a/src/pages/workspace/content/discover-contents/index.tsx +++ b/src/pages/workspace/content/discover-contents/index.tsx @@ -190,7 +190,7 @@ const ContentsPage = () => { LIMIT ? '15px' : '0px' }}> - All My Contents + Discover Contents {/* Here you see all your content. */}